AVX相当于_mm_storeu_ps?

时间:2015-03-29 17:20:07

标签: sse intrinsics avx

我有一个非常快的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更糟,除此之外..

1 个答案:

答案 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的外部指令集。

由于CPU-RAM带宽缺点,存储器操作在大规模上不是特别优化的。如果您使用非常大的阵列,那么SSE4 loadu和AVX loadu之间几乎没有区别,6车道高速公路将只有每个都有能力处理X许多车辆,无论您从一个车辆询问多少辆车时间。当您可以隐藏将其加载到其他工作之后的延迟时,小型数组的情况往往不是这种情况。您不应该交换AVX指令和SSE,这不仅是因为设计复杂性,还因为内部cpu并发症。

此外,您不希望将FPU状态从AVX更改为SSE,因为这本身会导致大多数人不考虑的性能开销。要么一个代码的大同源部分处于一个状态(SSE,AVX),要么具有SSE或AVX

的所有内容

语法警告我不能语法