使用 AVX/AVX2 内在函数,我可以使用以下方法收集 8 个值集,1,2 或 4 字节整数或 4 字节浮点数:
_mm256_i32gather_epi32()
_mm256_i32gather_ps()
但目前,我有一个案例,我正在加载在 nvidia GPU 上生成并存储为 FP16 值的数据。如何对这些值进行矢量化加载?
到目前为止,我找到了_mm256_cvtph_ps() 内在函数。
但是,该内在函数的输入是__m128i值,而不是__m256i值。
查看 Intel Intrinsics Guide,我没有看到将 8 个值存储到 _mm128i 寄存器中的收集操作?
如何将 FP16 值收集到 __m256 寄存器的 8 个通道中?是否可以将它们作为 2 字节短路向量加载到 __m256i 中,然后以某种方式将其减少到 __m128i 值以传递给转换内在函数?如果是这样,我还没有找到内在函数来做到这一点。
更新
我按照@peter-cordes 的建议尝试了演员阵容,但我得到了虚假的结果。另外,我不明白这怎么可能?
我的 2 字节 int 值存储在 __m256i 中:
0000XXXX 0000XXXX 0000XXXX 0000XXXX 0000XXXX 0000XXXX 0000XXXX 0000XXXX
那么我怎样才能简单地转换为 __m128i 需要紧密包装的地方
XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
演员会这样做吗?
我当前的代码:
__fp16* fielddensity = ...
__m256i indices = ...
__m256i msk = _mm256_set1_epi32(0xffff);
__m256i d = _mm256_and_si256(_mm256_i32gather_epi32(fielddensity,indices,2), msk);
__m256 v = _mm256_cvtph_ps(_mm256_castsi256_si128(d));
但结果似乎不是 8 个正确形成的值。我认为目前每第二个对我来说都是假的?