草庐IT

c++ - 使用 SSE 加速浮点 5x5 矩阵 * vector 乘法

我需要每秒运行240000次矩阵vector乘法。矩阵是5x5并且始终相同,而vector在每次迭代时都会发生变化。数据类型为float。我正在考虑使用一些SSE(或类似)指令。我担心算术运算的数量与所涉及的内存运算的数量相比太少了。您认为我可以得到一些切实的(例如>20%)改进吗?我需要英特尔编译器吗?你能指出一些引用吗? 最佳答案 Eigen用于vector、矩阵等的C++模板库...两者都有针对固定大小的小矩阵(以及动态大小的矩阵)的优化代码使用SSE优化的优化代码所以你应该试一试。

c++ - 如何在 Visual Studio 2008 中启用 SSE/SSE2 指令集(使用 CMake)?

在VisualStudio2005中,我进入了:查看-->属性页-->C/C++-->代码生成-->启用增强指令集但在VisualStudio2008中?提前致谢 最佳答案 如果您正在寻找SSE/SSE2:Project>Properties>ConfigurationProperties>C/C++>CodeGeneration>EnableEnhancedInstructionSet,或附加/arch:SSE(或/arch:SSE2)在CommandLine>AdditionalOptions.不过,您需要有一个原生项目,并至少

c++ - 为什么 SSE set (_mm_set_ps) 会颠倒参数的顺序

我最近注意到_m128m=_mm_set_ps(0,1,2,3);在转换为float组时将4个float倒序排列:(float*)p=(float*)(&m);//p[0]==3//p[1]==2//p[2]==1//p[3]==0union{_m128m;也是如此。float[4]一个;}也是。为什么SSE操作使用这种排序?这没什么大不了的,但有点令人困惑。还有一个后续问题:当通过索引访问数组中的元素时,应该按0..3的顺序还是3..0的顺序访问? 最佳答案 取决于你想要做什么,你可以使用_mm_set_ps或_mm_setr_p

c++ - 确定处理器对 SSE2 的支持?

我需要在安装软件之前确定处理器对SSE2的支持。据我了解,我想出了这个:boolTestSSE2(char*szErrorMsg){__try{__asm{xorpdxmm0,xmm0//executingSSE2instruction}}#pragmawarning(suppress:6320)__except(EXCEPTION_EXECUTE_HANDLER){if(_exception_code()==STATUS_ILLEGAL_INSTRUCTION){_tcscpy_s(szErrorMsg,MSGSIZE,_T("StreamingSIMDExtensions2(SSE

c++ - 一个 SSE Stdlib 式的库?

通常,我在“网上”遇到的与SSE/MMX相关的所有内容都是作为vector和矩阵的数学内容出现的。但是,我正在寻找SSE优化的“标准函数”库,例如AgnerFog提供的库,或GCC中一些基于SSE的字符串扫描算法。作为一个快速的总体纲要:这些将是memset、memcpy、strstr、memcmpBSR/BSF之类的东西,即从SSE指令构建的stdlib-esque我更希望它们使用内在函数而不是汇编用于SSE1(正式的MMX2),但两者都可以。希望这不是太广泛的范围。更新1经过一番搜索,我发现了一些有前途的东西,一个图书馆引起了我的注意:LibFreeVec:似乎仅适用于mac/IB

c++ - 利用 SSE 和其他 CPU 扩展

在我的代码库中有几个地方,对于大型数据集,相同的操作会重复很多次。在某些情况下,处理这些需要相当长的时间。我相信使用SSE来实现这些循环应该会显着提高它们的性能,尤其是在对同一组数据执行许多操作的情况下,所以一旦数据最初被读入缓存,就不应该有任何缓存错过了它。但是我不确定是否要这样做。是否有独立于编译器和操作系统的方式编写代码以利用SSE指令?我喜欢包含SSE操作的VC++内在函数,但我还没有找到任何交叉编译器解决方案。我仍然需要支持一些没有或有限SSE支持的CPU(例如IntelCeleron)。是否有某种方法可以避免制作不同版本的程序,例如使用某种“运行时链接器”,根据进程启动时运

c++ - gcc 4.8.1 默认启用 sse 吗?

我在不支持SSE4.1的系统上运行我的旧代码时遇到崩溃,我调试了一下并在glibc中找到了SSE指令,这可能吗?为什么gcc4.8.1发行说明中没有报告这一点? 最佳答案 您可以通过以下命令查看GCC使用了哪些优化:$gcc-Q--help=target例如,在我的机器上,GCC默认不启用sse4.1:$gcc-Q--help=target|grepmsse4.1-msse4.1[disabled]但是,它是受支持的,因为它出现在/proc/cpuinfo中。事实上,如果我要求GCC为我的机器优化生成的代码,它会启用sse4.1:$

c++ - 添加 SSE 寄存器的组件

我想添加SSE寄存器的四个组件以获得单个float。这就是我现在的做法:floata[4];_mm_storeu_ps(a,foo128);floatx=a[0]+a[1]+a[2]+a[3];有没有直接实现这个的SSE指令? 最佳答案 您可能会使用HADDPSSSE3指令,或其编译器内在_mm_hadd_ps,例如,参见http://msdn.microsoft.com/en-us/library/yd9wecaa(v=vs.80).aspx如果你有两个寄存器v1和v2:v=_mm_hadd_ps(v1,v2);v=_mm_had

c++ - 如何使用 SSE/AVX 高效地执行 double/int64 转换?

SSE2有在单精度float和32位整数之间转换vector的指令。_mm_cvtps_epi32()_mm_cvtepi32_ps()但是没有double和64位整数的等价物。换句话说,它们不见了:_mm_cvtpd_epi64()_mm_cvtepi64_pd()AVX好像也没有。模拟这些内在函数的最有效方法是什么? 最佳答案 在AVX512之前没有单一指令,它添加了与64位整数(有符号或无符号)的转换。(还支持与32位无符号的转换)。查看像_mm512_cvtpd_epi64这样的内在函数和更窄的AVX512VL版本,如_mm

c++ - SSE2 整数溢出检查

当使用诸如PADDD(即_mm_add_epi32内在函数)等SSE2指令时,有没有办法检查是否有任何操作溢出?我认为MXCSR控制寄存器上的标志可能会在溢出后设置,但我没有看到这种情况发生。例如,_mm_getcsr()在以下两种情况下打印相同的值(8064):#include#includeusingnamespacestd;voidmain(){__m128ia=_mm_set_epi32(1,0,0,0);__m128ib=_mm_add_epi32(a,a);cout还有其他方法可以检查SSE2是否溢出? 最佳答案 这里是