小编gle*_*uld的帖子

英特尔AVX:256位版本的点积,用于双精度浮点变量

英特尔高级矢量扩展指令集(AVX)在256位版本(YMM寄存器)中不提供双精度浮点变量的点积."为什么?" 问题已在另一个论坛(此处)和Stack Overflow(此处)进行了简要处理.但我面临的问题是如何以有效的方式用其他AVX指令替换这条缺失的指令?

对于单精度浮点变量,存在256位版本的点积(此处参考):

 __m256 _mm256_dp_ps(__m256 m1, __m256 m2, const int mask);
Run Code Online (Sandbox Code Playgroud)

我们的想法是找到这个缺失指令的有效等价物:

 __m256d _mm256_dp_pd(__m256d m1, __m256d m2, const int mask);
Run Code Online (Sandbox Code Playgroud)

更具体地说,我想从__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, …
Run Code Online (Sandbox Code Playgroud)

c++ performance simd avx

24
推荐指数
3
解决办法
1万
查看次数

英特尔AVX:为什么双精度浮点变量没有256位版本的点积?

关于SO的另一个问题中,我们尝试(并成功)找到替换AVX缺失指令的方法:

 __m256d _mm256_dp_pd(__m256d m1, __m256d m2, const int mask);
Run Code Online (Sandbox Code Playgroud)

谁知道为什么这条指令丢失了?部分答案在这里.

c++ performance simd avx

5
推荐指数
1
解决办法
1755
查看次数

标签 统计

avx ×2

c++ ×2

performance ×2

simd ×2