我的C ++代码使用SSE,现在我想对其进行改进以支持AVX。因此,我检测到AVX何时可用,并调用使用AVX命令的函数。我使用Win7 SP1 + VS2010 SP1和带有AVX的CPU。
要使用AVX,必须包括以下内容:
#include "immintrin.h"
然后您可以使用内在AVX函数,例如
_mm256_mul_ps
,_mm256_add_ps
等。问题在于,默认情况下,VS2010生成的代码运行缓慢,并显示警告:
警告C4752:找到英特尔(R)高级矢量扩展;考虑使用/ arch:AVX
似乎VS2010实际上并不使用AVX指令,而是模拟它们。我在编译器选项中添加了
/arch:AVX
,并获得了良好的结果。但是此选项告诉编译器尽可能在任何地方使用AVX命令。因此,我的代码可能在不支持AVX的CPU上崩溃!
所以问题是如何使VS2010编译器生成AVX代码,但仅当我直接指定AVX内部函数时才如此。对于SSE来说,它可以工作,我只使用SSE内在函数,它可以生成SSE代码,而无需任何编译器选项,例如/arch:SSE
。但是对于AVX,由于某些原因它无法正常工作。
我的C ++代码使用SSE,现在我想对其进行改进以支持AVX。因此,我检测到AVX何时可用,并调用使用AVX命令的函数。我使用Win7 SP1 + VS2010 SP1和一个...
您看到的行为是昂贵的状态切换的结果。
tl; dr