gpt4 book ai didi

c++ - 英特尔 AVX : 256-bits version of dot product for double precision floating point variables

转载 作者:IT老高 更新时间:2023-10-28 13:00:03 25 4
gpt4 key购买 nike

英特尔高级 vector 扩展 (AVX) 在 256 位版本(YMM 寄存器)中不为 double 浮点变量提供点积。 “为什么?”这个问题在另一个论坛 (here) 和 Stack Overflow (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(四个 float )转换为 __m256d(4 个 double )的代码使用以下说明:

   __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) )));

这段代码的结果是一个由四个 float 组成的 _m128 vector ,其中包含 val1val0 之间的点积结果,val2val0val3val0val4val0.

也许这可以为建议提供提示?

最佳答案

我会使用 4*double 乘法,然后是 hadd(不幸的是,它只在上下半部分添加了 2*2 float ),提取上半部分(随机播放应该同样有效,也许更快)并将其添加到下半部分。

结果在dotproduct的低64位。

__m256d xy = _mm256_mul_pd( x, y );
__m256d temp = _mm256_hadd_pd( xy, xy );
__m128d hi128 = _mm256_extractf128_pd( temp, 1 );
__m128d dotproduct = _mm_add_pd( (__m128d)temp, hi128 );

编辑:
根据 Norbert P 的想法,我扩展了这个版本,一次做 4 个点积。

__m256d xy0 = _mm256_mul_pd( x[0], y[0] );
__m256d xy1 = _mm256_mul_pd( x[1], y[1] );
__m256d xy2 = _mm256_mul_pd( x[2], y[2] );
__m256d xy3 = _mm256_mul_pd( x[3], y[3] );

// low to high: xy00+xy01 xy10+xy11 xy02+xy03 xy12+xy13
__m256d temp01 = _mm256_hadd_pd( xy0, xy1 );

// low to high: xy20+xy21 xy30+xy31 xy22+xy23 xy32+xy33
__m256d temp23 = _mm256_hadd_pd( xy2, xy3 );

// low to high: xy02+xy03 xy12+xy13 xy20+xy21 xy30+xy31
__m256d swapped = _mm256_permute2f128_pd( temp01, temp23, 0x21 );

// low to high: xy00+xy01 xy10+xy11 xy22+xy23 xy32+xy33
__m256d blended = _mm256_blend_pd(temp01, temp23, 0b1100);

__m256d dotproduct = _mm256_add_pd( swapped, blended );

关于c++ - 英特尔 AVX : 256-bits version of dot product for double precision floating point variables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10454150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com