摘要:新版本——http://www.cnblogs.com/zyl910/archive/2012/11/07/zintrin_v102.html[C] zintrin.h: 智能引入intrinsic函数 V1.02版。支持VC2012,增加INTRIN_ALIGN、INTRIN_COMPILER_NAME宏作者:zyl910。 之前的zintrin V1.00版对Mac OS X平台支持性不佳。现在的V1.01版改进对Mac OS X的支持,还做了这些改进——增加INTRIN_WORDSIZE宏 等。一、更新说明1.1 改进对Mac OS X的支持 前几天在使用Xcode时,发现mac下也..
阅读全文
随笔分类 - K20 SIMD_单指令流多数据流
SIMD(Single Instruction Multiple Data):单指令流多数据流
摘要:新版本——http://www.cnblogs.com/zyl910/archive/2012/10/13/ccpuid_v103.html作者:zyl910。 之前的ccpuid V1.01版只支持Windows和Linux平台。现在的V1.02版增加对Mac OS X平台的支持,还做了这些改进——支持纯C、增加CPUF常数、x86平台判断。一、更新说明1.1 支持Mac OS X平台 之前我发现了Mac OS X中的“/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/li..
阅读全文
摘要:作者:zyl910 前段时间我尝试用Finder的搜索功能查找intrin头文件,可惜没有找到,于是误以为Mac OS X的llvm-gcc不支持intrin函数。 今天在使用Xcode时,发现它是支持的,intrin头文件位于“/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/4.0/include”目录中。 搜索不到文件,可能是因为“/Applications/Xcode.app”并不是普通的目录。 在Finder中定位到“应用程序”目录,如果双击...
阅读全文
摘要:新版本——http://www.cnblogs.com/zyl910/archive/2012/10/01/zintrin_v101.html作者:zyl910。 现在很多编译器支持intrinsic函数,这给编写SSE等SIMD代码带来了方便。但是各个编译器略有差异,于是我编写了zintrin.h,智能引入intrinsic函数。一、各种编译器的区别1.1 Visual C++(Windows) 最早支持intrinsic函数的VC编译器是VC 6.0。它在装上Visual Studio 6.0 Service Pack 5、Visual C++ 6.0 Processor Pack这两..
阅读全文
摘要:作者: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..
阅读全文
摘要:作者:zyl910更多详情见——http://www.cnblogs.com/zyl910/archive/2012/04/26/md00.htmlSIMD函数整理:00 索引贴R:寄存器。M:64位MM寄存器;X:128位XMM寄存器;Y:256位YMM寄存器。Name:函数名。Name2:另一种函数名。功能:功能描述。Asm:汇编指令。PCode:伪代码。RNameName2功能AsmPCodeX_MM_SHUFFLE混洗的掩码.4#http://msdn.microsoft.com/en-us/library/4d3eabky(vs.71).aspxX_MM_TRANSPOSE4_PS矩
阅读全文
摘要:作者: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...
阅读全文
摘要:从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..
阅读全文
摘要:除了基本的MMX和SSE系列指令集外,x86体系还有其他扩展指令集,例如SSE4A、AES、PCLMULQDQ等,它们也可以利用CPUID指令来检测。但是,这些指令集细碎杂多。如果像以前那样分别编写检测函数的话,那工作量太大,不值得。而且大量的函数名也会给使用带来麻烦。于是文篇探讨如何设计一套通用的检测方案。零、指令简介 SSE4A指令:是AMD提出的,最早出现在2007年的K10微架构的处理器上。它针对Intel的SSE4指令集修改而来,去除其中对I64优化的指令,保留图形、影音编码、3D运算、游戏等多媒体指令,并完全兼容。 AES指令:是Intel提出的,最早出现在2010年的West..
阅读全文
摘要:以前我写了一篇《[VC6] 检查MMX和SSE系列指令集的支持级别(最高SSE4.2)》(http://www.cnblogs.com/zyl910/archive/2012/03/01/checksimd.html)。现在发现该方法存在两点缺陷——1.不支持64位,因为VC的64位程序不支持内嵌汇编;2.没有区分硬件支持与操作系统支持。 怎么解决这两点缺陷呢? 对于第1点,可以利用Intrinsics函数来兼容32位和64位。为了更方便的使用CPUID指令,可以利用《如何在各个版本的VC及64位下使用CPUID指令》(http://www.cnblogs.com/zyl910/arc...
阅读全文
摘要:作者:zyl910 关于SIMD(MMX、SSE、AVX)编程的资料一直很零散,于是我试图进行收集整理,便于随时翻阅学习。而且很多代码是直接用汇编写的,易读性差、难以重用,于是我决定将其统一改写为Intrinsics函数版。一、Instructions函数对照表 在使用Instructions函数时,很多时候会发现MSDN说的不详细,这时只有去翻阅Intel、AMD文档了。但Intel、AMD文档都是按照汇编指令名排序的,查起来不太方便。 而且SIMD指令大多很复杂,文字描述难以详细的解释其功能,唯有伪代码才能精确的解释其功能。但Intel、AMD文档上的伪代码大多很长,不适合随时翻阅。...
阅读全文
摘要:当使用Intrinsics函数来操作SIMD指令集(MMX/SSE/AVX等)时,会面对不同长度的SIMD数据类型,其中又分为多种紧缩格式。为此,我设计了一套SIMD变量命名规范,可以有效的提高代码的可读性。一、SIMD数据类型简介 SIMD数据类型有——__m64:64位紧缩整数(MMX)。__m128:128位紧缩单精度(SSE)。__m128d:128位紧缩双精度(SSE2)。__m128i:128位紧缩整数(SSE2)。__m256:256位紧缩单精度(AVX)。__m256d:256位紧缩双精度(AVX)。__m256i:256位紧缩整数(AVX)。注:紧缩整数包括了8位、16...
阅读全文
摘要:在传统印象中,数字的比较关系只有6种。但在AVX指令集中,Intel一下给出了32种浮点比较谓词,详见下图——(Intel手册:Table 3-9. Comparison Predicate for VCMPPD and VCMPPS Instructions) 为什么会有这么多种比较谓词呢?我为此困惑困惑了很久。 直到最近翻阅了不少资料后,才终于将它们弄懂了。一、浮点数据类型 Intel使用的是IEEE 754规范的浮点数据类型。对于浮点数据类型来说,除了可以存储数字、无穷之外,还可以存储 NaN(not a number。非数)。 NaN(非数)分为两大类——1.QNaN:qu...
阅读全文
摘要:一、测试结果汇总 将前面的测试结果进行汇总,整理为表格(单位是毫秒,数值越小越好)—— 测试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...
阅读全文
摘要:在上一篇测试了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 ...
阅读全文
摘要:前面我们测试了高级语言做饱和处理的性能。其实,对于这样的大批量数据处理,使用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年推出的一项多媒体指...
阅读全文
摘要:参考文献——《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
阅读全文
摘要: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
阅读全文
摘要:自1996年的MMX指令集以来,Intel和AMD不断为x86体系添加新的SIMD指令集。时至2012年,Intel的Ivy Bridge即将发布,这16年来SIMD指令集有了哪些发展呢?于是我决定整理一份SIMD指令集的发展历程表。通过阅读Intel和AMD的手册,以及搜索网上资料,我初步完成了这项工作。表格如下—— 指令集条DateICPUIDateACPUADateMemoMMX571996-10-12Pentium MMX(P55C)1996-10-12K61997-4-1MultiMedia eXtensionSSE701999-5-1Pentium III(Katma...
阅读全文
摘要:今天在百度上看到一则消息——http://tieba.baidu.com/p/1362181987IVY Bridge : There's more than 22nmI named this title...this is a information that were said to be confirmed on Intel forums"• Two instructions to support 16-bit floating-point data type conversion to and from single-precision floating-point
阅读全文