【发布时间】:2012-05-14 07:29:33
【问题描述】:
英特尔高级矢量扩展 (AVX) 在 256 位版本(YMM 寄存器)中不为双精度浮点变量提供点积。 “为什么?”这个问题已经在另一个论坛 (here) 和 StackOverflow (here) 上得到了非常简短的处理。但我面临的问题是如何以有效的方式用其他 AVX 指令替换这条缺失的指令?
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(四个双精度数)的代码使用以下说明:
__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、@ 之间的点积结果987654336@和val0。
也许这可以为建议提供提示?
【问题讨论】:
-
感谢您的想法,但我应该在我的应用程序中保持双精度。
-
此外,转换+浮点乘积比双点乘积需要更多时间。
标签: c++ performance simd avx