zyl910

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

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

随笔分类 -  H11Q x64

64位,QDWORD
摘要:作者:zyl910。一、更新说明1.1 支持VC2012 VC2012增加了很多Intrinsics函数,详见——http://www.cnblogs.com/zyl910/archive/2012/11/06/intrin_vc2012.html检查了一下VC2012新增的Intrinsics函数集,发现它支持ARM指令和Haswell新指令 根据上述信息改进zintrin,检测到是VC2012时定义相关的宏—— #if _MSC_VER >=1700 // VC2012 #define INTRIN_AVX2 1 // immint... 阅读全文
posted @ 2012-11-07 22:18 zyl910 阅读(2340) 评论(1) 推荐(2) 编辑

摘要:作者:zyl910 之前我整理了一份VC6至VC2010中Intrinsics函数集对应表。现在VS2012发布了,它有没有增加Intrinsics函数集呢?于是我对此进行检查。 若是64位win8系统中默认安装的VS2012,Intrinsics头文件位于“C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include”目录。 首先发现多了两个Intrinsics头文件——armintr.h:ARM的常用指令集。arm_neon.h:ARM的neon指令集。 看了一下intrin.h,发现以前大段的ARM Intrinsi... 阅读全文
posted @ 2012-11-06 22:49 zyl910 阅读(4825) 评论(0) 推荐(1) 编辑

摘要:一、popcnt指令简介 popcnt是“population count”的缩写,该操作一般翻译为“位1计数”,即统计有多少个“为1的位”。例如,十六进制数“FF”,它有8个为1的位,即“popcnt(0xFF) = 8”。popcnt主要应用在密码学与通信安全,例如计算汉明重量(Hamming weight)。 x86体系最初是没有硬件popcnt指令的,只能靠软件计算。 2008年底,Intel发布了Nehalem架构的处理器,增加了SSE4.2指令集,其中就有硬件popcnt指令。虽然它名义上是属于SSE4.2指令集,但它并不使用XMM寄存器(SSE的128位寄存器),而是使用G... 阅读全文
posted @ 2012-11-02 23:00 zyl910 阅读(11632) 评论(0) 推荐(4) 编辑

摘要:作者:zyl910。列名解释——GCC470:GCC 4.7.0 (Fedora 17)。/usr/lib/gcc/i686-redhat-linux/4.7.0/include/。GCC462:GCC 4.6.2 (MinGW)。\lib\gcc\mingw32\4.6.2\include。宏:判断该指令集是否启用的宏。参数:启用该指令集的命令行参数。描述:指令集描述。 GCC470GCC462宏参数描述abmintrin.h__ABM__-mabmABM: Advanced Bit Manipulation. 改为lzcntintrin.h.ammintrin.hammintrin.h.. 阅读全文
posted @ 2012-08-27 22:45 zyl910 阅读(11504) 评论(1) 推荐(1) 编辑

摘要:作者:zyl910。 之前的ccpuid V1.00版(http://www.cnblogs.com/zyl910/archive/2012/07/11/ccpuid.html)只支持VC。 现在的V1.01版支持GCC,不仅兼容32位/64位Linux下的GCC,还兼容Windows下的MinGW、MinGW-w64、TDM-GCC等。可以自由的编译为Windows下、或Linux下的程序。一、更新说明 主要的改进有——1. 支持GCC。2. 使用getcpuid/getcpuidex函数来获取CPUID信息。3. 使用C99标准整数类型uint32_t,提高可移植性。二、全部代码2.... 阅读全文
posted @ 2012-08-22 23:01 zyl910 阅读(4355) 评论(0) 推荐(1) 编辑

摘要:作者:zyl910 为了适应现在越来越流行的64位系统,经常需要将代码分别编译为32位版和64位版。其次,除了需要生成debug版用于开发测试外,还需要生成release版用于发布。本文介绍了如何利用makefile条件编译来生成这些版本,而且不仅兼容Linux下的GCC,还支持MinGW、TDM-GCC等Windows下的GCC编译器。一、C程序代码 为了测试条件编译的效果,以下面这个C语言程序为例(gcc64_make.c)——#include <stdio.h>#include <assert.h>// 获取程序位数(被编译为多少位的代码)int GetProgr 阅读全文
posted @ 2012-08-14 16:05 zyl910 阅读(88426) 评论(3) 推荐(7) 编辑

摘要:作者:zyl910 前面我们尝试过在VC中获取CPUID信息。现在再来试试GCC编译器。一、调用CPUID指令 怎么调用CPUID指令呢?有三种办法——1. 用汇编语言编写一个cpuid函数,然后调整链接器配置,在C语言中调用该函数。2. 使用内嵌汇编调用CPUID指令。3. 使用编译器提供的Intrinsics函数来调用CPUID等特定平台指令。 我们一般优先使用第3种办法,代码量少、可读性高、编译维护简单。例如VC(VC2005或更高)在“intrin.h”中声明了 __cpuid函数。 当编译器没有提供Intrinsics函数时,就只有使用前两种办法了。1.1 查找函数 首先,... 阅读全文
posted @ 2012-08-06 16:17 zyl910 阅读(17754) 评论(0) 推荐(2) 编辑

摘要:作者:zyl910更多详情见——http://www.cnblogs.com/zyl910/archive/2012/04/26/md00.htmlSIMD函数整理:00 索引贴Name:函数名。Name2:另一种函数名。功能:功能描述。Asm:汇编指令。PCode:伪代码。 NameName2功能AsmPCode_m_empty_mm_emptyMMX状态置空EMMS_m_from_int_mm_cvtsi32_si64加载32位MOVDr=ZX(i)_m_to_int_mm_cvtsi64_si32返回低32位MOVDr=(uD)m_m_packsswb_mm_packs_pi16... 阅读全文
posted @ 2012-07-19 22:48 zyl910 阅读(4357) 评论(0) 推荐(0) 编辑

摘要:作者:zyl910 关于获取各种CPUID信息,我之前积累了不少代码,现在决定将它们封装在一个模块中,方便代码复用。 其次,前面只是介绍了CPUID的一些常用功能,而Intel、AMD的手册中定义了大量的CPUID功能。所以我希望有一个程序能按照功能号顺序,依次显示所有的CPUID信息。这样就能很方便的与Intel、AMD的手册进行对照,有助于学习与理解。一、模块设计 最初方案是 想将所有功能全部放在一个“ccpuid.h”头文件中,这样用起来会比较方便。 但是考虑到全局变量等问题,以及需要编写CCPUID类。所以最终决定按照常规做法,分解为头文件与实现文件。 对于原先所写的宏定义、... 阅读全文
posted @ 2012-07-11 16:17 zyl910 阅读(1120) 评论(0) 推荐(0) 编辑

摘要:从2011年的Sandy Bridge微架构处理器开始,现在支持AVX系列指令集的处理器越来越多了。本文探讨如何用VC编写检测AVX系列指令集的程序,并利用了先前的CPUIDFIELD方案。一、AVX系列指令集简介 SSE5 指令:SSE5 是一个纸面上的指令集,并没有最终实现,AMD 在 2007 年 8 月公布 SSE5 指令集规范,在 2009 年 5 月 AMD 推出了 XOP,FMA4 以及 CVT16 来取代 SSE5 指令。 AVX 指令:2008 年 3 月 Intel 发布了 AVX(Advanced Vector Extensions)指令集规范,首次在 Sandy B.. 阅读全文
posted @ 2012-07-04 16:01 zyl910 阅读(11636) 评论(0) 推荐(0) 编辑

摘要:除了基本的MMX和SSE系列指令集外,x86体系还有其他扩展指令集,例如SSE4A、AES、PCLMULQDQ等,它们也可以利用CPUID指令来检测。但是,这些指令集细碎杂多。如果像以前那样分别编写检测函数的话,那工作量太大,不值得。而且大量的函数名也会给使用带来麻烦。于是文篇探讨如何设计一套通用的检测方案。零、指令简介 SSE4A指令:是AMD提出的,最早出现在2007年的K10微架构的处理器上。它针对Intel的SSE4指令集修改而来,去除其中对I64优化的指令,保留图形、影音编码、3D运算、游戏等多媒体指令,并完全兼容。 AES指令:是Intel提出的,最早出现在2010年的West.. 阅读全文
posted @ 2012-06-29 14:11 zyl910 阅读(4075) 评论(0) 推荐(0) 编辑

摘要:作者: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) 编辑

摘要:前面我们测试了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) 编辑

摘要:如今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) 编辑