zyl910

优化技巧、硬件体系、图像处理、图形学、游戏编程、国际化与文本信息处理。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

随笔分类 -  C00 Language_语言

上一页 1 2 3 4 下一页

摘要:前面我们探讨了在16位的DOS实模式下使用CPUID指令(http://www.cnblogs.com/zyl910/archive/2012/05/14/dos16_getcpuid.html)。而现在64位Windows系统已经很流行了,在32/64位模式下如何使用CPUID呢?于是本文介绍了如何在各个版本的VC及64位下使用CPUID指令。一、推荐使用__cpuid、__cpuidex等Intrinsics函数 在32位模式下,我们可以使用内嵌汇编来调用cpuid指令。但在64位模式下,VC编译器不支持内嵌汇编。 于是微软提供了Intrinsics函数——编译器会将Intrins... 阅读全文
posted @ 2012-05-21 18:04 zyl910 阅读(12614) 评论(0) 推荐(0) 编辑

摘要:有时我们需要编写DOS实模式下的CPU信息诊断程序,但是TurboC++等很多16位C++编译器不支持CPUID指令和32位汇编。于是本文介绍了一种办法,靠内嵌机器码实现了获取CPUID信息。一、CPUID指令简介 CPUID指令是intel IA32架构下获得CPU信息的汇编指令,可以得到CPU类型,型号,厂商信息,商标信息,序列号,缓存等一系列CPU相关的东西。 CPUID指令一般使用使用eax作为输入参数(某些时候会用到ecx),eax、ebx、ecx、edx作为输出参数。例如这样的汇编代码——mov eax, 1cpuid... 以上代码以1为输入参数,执行cpuid后... 阅读全文
posted @ 2012-05-14 23:57 zyl910 阅读(4085) 评论(0) 推荐(0) 编辑

摘要:tiled_index类中有4个属性与线程编号有关——tiled_index.global:线程的全局编号。相当于DirectCompute中的SV_DispatchThreadID。tiled_index.local:线程的局部编号。相当于DirectCompute中的SV_GroupThreadID。tiled_index.tile:线程块的编号。相当于DirectCompute中的SV_GroupID。tiled_index.tile_origin:线程块中首个线程的全局编号。(tile_origin=global-local)。参考文献——http://msdn.microsoft.c 阅读全文
posted @ 2012-05-09 15:24 zyl910 阅读(824) 评论(0) 推荐(0) 编辑

摘要:现在多核处理器已经很普及了,市场主流是双核处理器,还有4核、8核等高端产品。而且Intel推广了超线程技术(Hyper-Threading Technology, HTT),可以将一个物理核心模拟为两个逻辑处理器。这一切使得“CPU数量”这一概念变得复杂起来,对于软件开发人员来说,希望能获得物理CPU数、CPU核心数、逻辑CPU数等详细信息。 在Windows平台,可以调用GetLogicalProcessorInformation函数来获取它们的详细信息。一、背景知识 先来明确一下名词——physical processor packages:物理处理器封装个数,即俗称的“物理CPU... 阅读全文
posted @ 2012-05-08 18:06 zyl910 阅读(2944) 评论(0) 推荐(1) 编辑

摘要:作者:zyl910 关于SIMD(MMX、SSE、AVX)编程的资料一直很零散,于是我试图进行收集整理,便于随时翻阅学习。而且很多代码是直接用汇编写的,易读性差、难以重用,于是我决定将其统一改写为Intrinsics函数版。一、Instructions函数对照表 在使用Instructions函数时,很多时候会发现MSDN说的不详细,这时只有去翻阅Intel、AMD文档了。但Intel、AMD文档都是按照汇编指令名排序的,查起来不太方便。 而且SIMD指令大多很复杂,文字描述难以详细的解释其功能,唯有伪代码才能精确的解释其功能。但Intel、AMD文档上的伪代码大多很长,不适合随时翻阅。... 阅读全文
posted @ 2012-04-26 21:53 zyl910 阅读(6827) 评论(0) 推荐(2) 编辑

摘要:一、测试结果汇总 将前面的测试结果进行汇总,整理为表格(单位是毫秒,数值越小越好)—— 测试f0_iff1_minf2_negf3_sarf4_mmxf5_sseVC6 on 32bit2016206371967237.525.7VC6 on 64bit2028207571868737.125.3VC2010(32) on 32bit17932112512437VC2010(32) on 64bit17162106514437VC2010(64) on 64bit16231997421328C#2010(any) on 32bit192221472471559C#2010(any) on... 阅读全文
posted @ 2012-04-13 17:20 zyl910 阅读(1813) 评论(2) 推荐(0) 编辑

摘要:在上一篇测试了MMX指令集,这次我们来测试SSE指令集。说的更精确一点,是测试SSE2指令集。 本篇致力于解决以下问题——1.SSE/SSE2指令集是什么?2.如何阅读Intel/AMD的手册?3.如何运用SSE指令集?如何将MMX代码升级为SSE代码。4.如何在VC++6.0这样的高级语言编译器中使用MMX指令集?一、简介 1999 年 Intel 推出了第 1 代的 SSE(Streaming SIMD Extensions)指令以回击 AMD 的 3DNow! 指令,使用在 Pentium III 处理器上。随后 AMD 在 2001 年 10 月 发布 的 Athlon XP ... 阅读全文
posted @ 2012-04-12 22:09 zyl910 阅读(4442) 评论(2) 推荐(0) 编辑

摘要:前面我们测试了高级语言做饱和处理的性能。其实,对于这样的大批量数据处理,使用SIMD(Single Instruction Multiple Data,单指令多数据流)技术能极大的提高性能。MMX指令集是目前x86平台上覆盖最广的SIMD指令集,于是本文对它进行探讨。 本文致力于解决以下问题——1.MMX指令集是什么?2.如何阅读Intel/AMD的手册?2.如何运用MMX指令集?3.如何在VC++6.0这样的高级语言编译器中使用MMX指令集?一、MMX指令集简介 MMX(Multi Media eXtension,多媒体扩展指令集)指令集是Intel公司于1996年推出的一项多媒体指... 阅读全文
posted @ 2012-04-09 22:25 zyl910 阅读(3324) 评论(0) 推荐(0) 编辑

摘要:前面我们测试了C系列语言,验证了位掩码算法的确实性能不错。那么对于Basic系列语言,该算法的效率怎样呢?于是本文对此进行探讨。 VB.Net与C#一样,也是由.Net虚拟机执行的,没有多大的测试价值。所以我决定测试VB6。一、移植要点 VB6的功能与C系列语言差很多。很多地方需要换另一种方法去实现,甚至不能实现。 要点有——1.VB6不支持控制台程序,只支持窗口程序。所以我们的测试程序得修改为窗口程序。2.VB6不支持指针,所以依靠数组。幸好现在的操作比较简单,用数组的性能损失不大。3.VB6没有带符号移位运算法,所以无法实现f3_sar函数。4.VB6和C#一样不支持宏,所以得手... 阅读全文
posted @ 2012-03-30 16:49 zyl910 阅读(3607) 评论(0) 推荐(0) 编辑

摘要:前面我们测试了C语言这样纯编译型语言。那么对于像C#这样由虚拟机执行的语言,“位掩码代替分支”法是否也有效果呢?于是本文对此进行探讨。一、移植要点 C#的语法与C语言很相像,多数代码可以直接用,但要注意以下几点。1.1 unsafe——不安全上下文 C#虽然支持指针,但必须在unsafe——不安全上下文 中才能使用。 要使用unsafe,必须先配置项目属性,允许不安全代码——1.项目->属性,打开项目的属性页。2.点击左侧“生成”,切换到“生成”页。3.点击上侧的“配置”组合框,选择“所有配置(C)”。4.勾选“常规”中的“允许不安全代码(F)”。5.点击工具栏上的“保存”按钮。 ... 阅读全文
posted @ 2012-03-29 17:08 zyl910 阅读(1416) 评论(0) 推荐(0) 编辑

摘要:前面我们用VC6测试了位掩码代替分支的速度。VC6是1998年发售的,离现在有14年了。在14年里,Intel与AMD的CPU都换了好几套微架构了,VC6编译器很可能无法充分发挥它们的性能。而且,从2003年AMD推出了64位处理器开始,现在64位系统越来越普及,我们希望测试64位下的性能。 于是选择最新的VC系列编译器——Visual C++ 2010,它是2010年发售的,支持x64平台。一、代码改进1.1 通用字符处理——tchar.h 传统的Windows程序一般使用ANSI+DBCS字符集。而从Windows NT开始,Windows内核采用Unicode字符集。但那时基于A... 阅读全文
posted @ 2012-03-28 16:35 zyl910 阅读(1146) 评论(0) 推荐(0) 编辑

摘要:wuhanbingwhdx提到了数据相关也会影响流水线(http://blog.csdn.net/zyl910/article/details/1330614)。 他的说法是有一定道理的。但是,在很多时候我们并不仅仅处理一个数值。比如将循环展开,在内循环处理2个或更多个的数值。而现代编译器面对循环展开时,在编译优化操作中会调整指令顺序,错开有相关性指令。因现代处理器支持超标量,这样的指令顺序调整能获得较好的指令级并行度,从而优化了性能。 其次,就算编译器对循环展开优化的不够彻底,没将相关性指令错开。但因现代处理器支持乱序执行,当遇到相关性指令需要等待时,处理器会处理后面未相关的指令,从... 阅读全文
posted @ 2012-03-27 15:31 zyl910 阅读(987) 评论(0) 推荐(0) 编辑

摘要:查看编译器生成的汇编代码,有助于我们分析程序的性能。1 让VC6输出编译的汇编代码 用VC6打开前一篇文章(http://www.cnblogs.com/zyl910/archive/2012/03/12/noifopex1.html)的工程“noifCheck.dsw”。 首先需要配置项目设置——1.点击菜单栏 “工程”->“Project Settings”打开“Project Settings”对话框。2.将“Settings For:”设为“Win32 Release”。3.将右侧的选项卡换到“C/C++”面板。4.点击“Category:”组合框,选择“Listing Fil. 阅读全文
posted @ 2012-03-21 15:10 zyl910 阅读(970) 评论(0) 推荐(0) 编辑

摘要:几年前我写了一篇“优化分支代码——避免跳转指令堵塞流水线”(http://blog.csdn.net/zyl910/article/details/1330614)。因当时是整理笔记,有些粗略。这几年又有了新的心得,故决定深入探讨,顺便回答网友评论。 housisong(http://blog.csdn.net/housisong)提到了用利用带符号移位生成掩码——(假设n是32bit有符号数): (n>>31) 当n>=0的时候结果为0x00000000,当n<0时得到0xFFFFFFFF掩码,然后利用该掩码来合并分支。 这是一个很好的思路,避免了状态寄存器访问。 但 阅读全文
posted @ 2012-03-12 16:56 zyl910 阅读(3539) 评论(2) 推荐(4) 编辑

摘要:参考文献——《Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2 (2A, 2B & 2C): Instruction Set Reference, A-Z》. December 2011. http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-instruction-set-reference-manual-325383.h 阅读全文
posted @ 2012-03-01 22:36 zyl910 阅读(4349) 评论(0) 推荐(0) 编辑

摘要:File:Intrinsics头文件描述:指令集描述VS:Visual Studio版本号VisualStudio:Visual Studio版本名File描述VSVisualStudiointrin.hAll Architectures8.02005mmintrin.hMMX intrinsics6.06.0 SP5+PP5xmmintrin.hStreaming SIMD Extensions intrinsics6.06.0 SP5+PP5emmintrin.hWillamette New Instruction intrinsics (SSE2)6.06.0 SP5+PP5pmmint 阅读全文
posted @ 2012-02-28 22:33 zyl910 阅读(8744) 评论(12) 推荐(0) 编辑

摘要:如今64位系统越来越流行了,对于软件开发人员来说,掌握64位开发技术将会有更好的发展空间。而且经过这几年的发展,64位开发工具也成熟了,例如Visual Studio 2010。 关于如何配置64位平台,MSDN上有详细的介绍——http://msdn.microsoft.com/zh-cn/library/9yb4317s.aspx如何:针对 64 位平台配置 Visual C++ 项目 在很多时候,我们希望能兼容老系统,于是配置了两个编译平台——Win32 和 x64。 但光这样做还是不够的,因为老系统不支持某些新功能。所以我们需要在运行时动态动态判断。 最常见的判断有两种——... 阅读全文
posted @ 2012-02-19 22:36 zyl910 阅读(8411) 评论(0) 推荐(0) 编辑

摘要:数据表的结构是——CREATE TABLE [dbo].[ac_mainctls_new] ([id] [int] NULL ,[ctlip] [bigint] NULL ,[ctlname] [char] (30) COLLATE Chinese_PRC_CI_AS NULL ,)其中ctlip是设备的IP地址,以整数方式存储。虽然可以用程序将整数转为IP字符串,但多了一道工序有点麻烦。于是我想直接在SQL查询语句中将其转为IP字符串。经过思索与调试,我完成了该查询语句——SELECT CAST(ctlip / 0x1000000 AS varchar(3)) + '.' + 阅读全文
posted @ 2012-02-01 14:48 zyl910 阅读(2581) 评论(1) 推荐(0) 编辑

摘要:上回我们学会了怎么计算级别(H.264 级别(Level)、DPB 与 MaxDpbMbs 详解)。但是每次手工计算就太麻烦了,我们希望有一款工具能完成这些运算。最好该工具还能跨平台使用。 在综合考虑上面的需求 和 开发难度性 后,我决定编写一个JavaScript网页程序。 最终效果—— 其实开发难度并不大,只要熟悉上回的级别计算公式,就能很容易实现。全部代码如下——<!DOCTYPE html PUBLIC "-//W3C//Dtd XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/Dtd/ 阅读全文
posted @ 2011-12-12 22:31 zyl910 阅读(3644) 评论(0) 推荐(2) 编辑

摘要:按“API Level”分类对于网页程序而言,可以理解为——将数据输出到不同的div。 很多SDK是与 API Level 相关的,具有“sdk:api-level”属性,它是一个整数,值为2(Android 1.1)至14(Android 4.0)。我们可以用数组来管理——var arrAPI = new Array(); // API Level数组。用于管理给出了API Level的。 除了与 API Level 相关的SDK外,还有一些文件是与SDK无关的,它们没有“sdk:api-level”属性。怎么处理呢?按xml标签名进行分类似乎比较好。因标签名是一个字符串,应使... 阅读全文
posted @ 2011-11-28 16:27 zyl910 阅读(1125) 评论(0) 推荐(0) 编辑

上一页 1 2 3 4 下一页