我有一个非常快的AVX代码,但它只是一个使用AVX的单一功能,其余的大项目是在SSE2上,所以我不想将架构设置为AVX。在每次迭代结束时,我需要将一个YMM寄存器中的4个双精度转换为4个浮点并将其存储为:
__m256d y = ......;
_mm_storeu_ps((float*)dst + i, _mm256_cvtpd_ps(y));
但是MSVC正在使用movups生成SSE2代码(没有“v”前缀)。有没有办法强制它只使用一个AVX指令?在我看来,唯一可知的方法是使用AVX作为目标,这在我看来非常荒谬。我想利用AVX只需一个周期。英特尔编译器显然理解它,因为我使用AVX自动调度它在那里运行良好,但通常英特尔编译器现在似乎没有办法,它很慢,代码比MSVC更糟,除此之外..
答案 0 :(得分:3)
_mm_storeu_ps(float*,_mm128)
的AVX等效值为_mm256_storeu_ps(float*,_mm256)
。首先,AVX是一个指令集。这意味着CPU必须在物理上具有寄存器空间和FPU前端才能使用它们。换句话说,给予非AVX处理器的AVX将不会运行。您必须使用/ arch -AVX进行编译,因为它是最新的,并且它向后兼容sse,sse2,sse3,ssse3,sse4,sse,sse4.1,sse4.2但反之则不正确。 AVX CPU补充了所有这些'但AVX是sse CPU的外部指令集。
此外,您不希望将FPU状态从AVX更改为SSE,因为这本身会导致大多数人不考虑的性能开销。要么一个代码的大同源部分处于一个状态(SSE,AVX),要么具有SSE或AVX
的所有内容语法警告我不能语法