【发布时间】:2020-05-09 18:49:07
【问题描述】:
我有一个基地址 (uint8_t*) 和一个包含 16 个偏移量的向量 (__m512i)。 我最终需要一个 __m128i,其中包含从 16 个不同内存位置收集的 16 个字节。
至于现在我明白了,没有这种原语,我能用的只有
uint8_t base;
__m512i offsets;
__m512i values = _mm512_i32gather_epi32(base, offsets, 1);
这给了我一个 __m512i 我有的地方
Vjjj Vjjj Vjjj Vjjj Vjjj Vjjj Vjjj Vjjj Vjjj Vjjj Vjjj Vjjj Vjjj Vjjj Vjjj Vjjj
(j 是垃圾,V 是我感兴趣的值)
现在我需要重新打包数据,以便最终得到一个只有我感兴趣的数据的向量,但我越来越困惑,我什至不知道我是否遵循正确的接近。
【问题讨论】:
-
MMX 是过时的 64 位向量,例如
__m64内在函数。__m128i是 SSE/AVX/AVX512 可以使用的最窄。_mm512_i32gather_epi32是 AVX512。如果您使用的是 AVX512 数据集,则在xmm0等 XMM 寄存器和mm0等 MMX 寄存器之间反弹数据是没有用的。可能你想要AVX512F__m128i _mm512_cvtepi32_epi8(__m512i),如果你确定你可以安全地读取你真正想要的每个字节末尾的 3 个字节。 -
相关:AVX2 byte gather with uint16 indices, into a __m256i 查看使用标量插入手动收集的性能,并讨论但未显示
vpgatherdd的代码。 -
你为什么不接受下面的精彩回答?
标签: c sse simd intrinsics avx512