英特尔高级矢量扩展(AVX)在256位版本(YMM寄存器)中不提供双精度浮点变量的点积。关于“为什么”问题已经在另一个论坛(here)和Stack Overflow(here)中简要讨论过。但我面临的问题是如何以高效的方式用其他AVX指令替换这个缺失的指令?
256位版本中的点积对于单精度浮点变量存在(reference here):
更具体地说,我想要将从
这段代码的结果是一个包含四个浮点数的
256位版本中的点积对于单精度浮点变量存在(reference here):
__m256 _mm256_dp_ps(__m256 m1, __m256 m2, const int mask);
这个想法是找到一种高效的替代方法来执行缺失的指令:
__m256d _mm256_dp_pd(__m256d m1, __m256d m2, const int mask);
更具体地说,我想要将从
__m128
(四个浮点数)转换为__m256d
(4个双精度浮点数)的代码使用以下指令: __m128 val0 = ...; // Four float values
__m128 val1 = ...; //
__m128 val2 = ...; //
__m128 val3 = ...; //
__m128 val4 = ...; //
__m128 res = _mm_or_ps( _mm_dp_ps(val1, val0, 0xF1),
_mm_or_ps( _mm_dp_ps(val2, val0, 0xF2),
_mm_or_ps( _mm_dp_ps(val3, val0, 0xF4),
_mm_dp_ps(val4, val0, 0xF8) )));
这段代码的结果是一个包含四个浮点数的
_m128
向量,其中包含了val1
和val0
、val2
和val0
、val3
和val0
、val4
和val0
之间的点积结果。也许这可以为建议提供一些提示?