根据文档,从gcc 4.9
指令AVX-512
集开始支持,但我有gcc 4.8
. 我目前有这样的代码来总结一块内存(保证小于 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];
提供更好的性能。