根据说明文件,从gcc 4.9
开始支持AVX-512
指令集,但是我有gcc 4.8
。目前,我有这样的代码用于加的内存块(它的保证是小于256个字节,所以没有溢出后顾之忧):模拟AVX-512屏蔽指令
__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];
了更好的性能。
我不清楚你在做什么。你有AVX512硬件,但不是一个编译器来支持?并不是128b(例如'_mm_mask_cvtepu8_epi16')和256b掩码操作需要KNL没有的“AVX-512VL”。你想要一个SSE唯一的解决方案? –
'for(int i = 0; i
@Zboson,是的,我现在无法轻易升级编译器。简单的'for'循环没有什么特别的错,但我只是想知道是否有更好的方法,因为实际的循环体比复杂一点更复杂 - 我有一个圆并且计算(左侧和右侧)和(顶部和底部)一半。 –