我有一个带有这些 16 位短值的 _m256i 向量,例如(lo -> hi):
2140 4635 5716 4331 1863 0 0 0 0 0 0 0 0 0 0 0
我需要使用 AVX 内在函数来获得这些值的总和 (18685),但我的分配规范说我不能使用像 hadd 这样的高延迟/吞吐量指令,并且所有并行部分必须完全矢量化。
我已经尝试遵循这些答案并将它们转换为与 __m256i 一起使用,但无济于事。 [使用 AVX 指令进行水平向量求和的最快方法 [重复]] 进行水平 SSE 向量求和(或其他缩减)的最快方法
到目前为止我尝试过的示例
原来的
double hsum_double_avx(__m256d v) {
__m128d vlow = _mm256_castpd256_pd128(v);
__m128d vhigh = _mm256_extractf128_pd(v, 1); // high 128
vlow = _mm_add_pd(vlow, vhigh); // reduce down to 128
__m128d high64 = _mm_unpackhi_pd(vlow, vlow);
return _mm_cvtsd_f64(_mm_add_sd(vlow, high64)); // reduce to scalar
}
矿
int hsum_int_avx(__m256i v) {
__m128i vLow = _mm256_castsi256_si128(v);
__m128i vHigh = _mm256_extracti128_si256(v, 0);
vLow = _mm_add_epi32(vLow, vHigh);
__m128i high64 = _mm_unpackhi_epi32(vLow, vLow);
return _mm_cvtsi128_si32(_mm_add_epi64(vLow, high64));
}
我的输出
vLow: 2140 4635 5716 4331 1863 0 0 0
vHigh: 0 0 0 0 0 0 0 0
vLow: 2140 4635 5716 4331 1863 0 0 0
high64: 1863 0 1863 0 0 0 0 0
return value: 4003?