gpt4 book ai didi

c++ - 模拟 AVX-512 掩码指令

转载 作者:行者123 更新时间:2023-11-30 03:33:44 25 4
gpt4 key购买 nike

根据文档,来自 gcc 4.9AVX-512 上支持指令集,但我有 gcc 4.8 .我目前有这样的代码来汇总一 block 内存(保证小于 256 字节,所以不用担心溢出):

__mm128i sum = _mm_add_epi16(sum, _mm_cvtepu8_epi16(*(__m128i *) &mem));

现在,查看文档,如果我们还剩下四个字节,我可以使用:

__mm128i sum = _mm_add_epi16(sum,
_mm_mask_cvtepu8_epi16(_mm_set1_epi16(0),
(__mmask8)_mm_set_epi16(0,0,0,0,1,1,1,1),
*(__m128i *) &mem));

(注意,__mmask8 的类型似乎在我能找到的任何地方都没有记录,所以我猜测......)

然而,_mm_mask_cvtepu8_epi16是一个 AVX-512指令,那么有没有办法复制它?我试过:

mm_mullo_epi16(_mm_set_epi16(0,0,0,0,1,1,1,1),
_mm_cvtepu8_epi16(*(__m128i *) &mem));

但是,有一个缓存停顿所以直接 for (int i = 0; i < remaining_bytes; i++) sum += mem[i];性能更好。

最佳答案

刚好碰到这个问题,到现在还没得到答案,如果这还是个问题...

对于您的示例问题,您的方向是正确的。

  • 乘法是一个相对较慢的操作,所以你应该避免使用_mm_mullo_epi16。使用 _mm_and_si128 代替,因为按位 AND 是一种更快的操作,例如_mm_and_si128(_mm_cvtepu8_epi16(*(__m128i *) &mem), _mm_set_epi32(0, 0, -1, -1))
  • 我不确定你所说的缓存停顿是什么意思,但是如果内存访问是一个瓶颈,并且编译器不会将上面的常量放入寄存器中,你可以使用类似 _mm_srli_si128( vector, 8) 不需要任何额外的寄存器/内存加载。移位可能比 AND 慢。
  • 如果总是8字节,可以使用_mm_move_epi64
  • 如果剩余数量不是固定数量的元素(例如,对于任意 n,您有 n%16 字节),这些都不能解决问题。 注意 AVX-512 也没有真正解决它。如果您需要处理这种情况,您可以有一个掩码表和 AND 取决于剩余的内容,例如_mm_and_si128( vector ,掩码[n & 0xf])
  • (_mm_mask_cvtepu8_epi16 只关心 vector 的低半部分,所以你的例子有点困惑——也就是说,你不需要屏蔽任何东西,因为后面的元素无论如何都被完全忽略了)

在更通用的层面上,掩码操作实际上只是一个嵌入的 _mm_blend_epi16(或等效项)。对于归零成语,可以使用 _mm_and_si128/_mm_andnot_si128 轻松模拟它们,如上所示。

关于c++ - 模拟 AVX-512 掩码指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42616373/

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