在 KNL (Xeon Phi 7210) 上将 16 位掩码 (__mmask16) 转换为 __m128i 控制字节掩码
Convert 16 bit mask (__mmask16) to __m128i control byte mask on KNL (Xeon Phi 7210)
我希望在 __mmask16 和 __m128i 之间进行转换。但是,正如在
上发布的那样
/* convert 16 bit mask to __m128i control byte mask */
_mm_maskz_broadcastb_epi8((__mmask16)mask,_mm_set1_epi32(~0))
_mm_maskz_broadcastb_epi8 以及类似的内容在 KNL 上尚不可用。 AVX512BW 在 KNL (Xeon Phi 7210) 上的缺失让我很头疼。
问题的根源是我想利用
_mm_maskmoveu_si128 (__m128i a, __m128i mask, char* mem_addr)
同时使用
__mmask16 len2mask[] = { 0x0000, 0x0001, 0x0003, 0x0007,
0x000F, 0x001F, 0x003F, 0x007F,
0x00FF, 0x01FF, 0x03FF, 0x07FF,
0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF,
0xFFFF };
如果您确实打算生成如下内容:
__m128i mask = _mm_maskz_broadcastb_epi8(len2mask[length],_mm_set1_epi32(~0))
为什么不只是:
void foo(int length, char* mem_addr, const __m128i a)
{
__m128i count = _mm_set_epi8(15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);
__m128i mask = _mm_cmpgt_epi8(_mm_set1_epi8(length), count);
_mm_maskmoveu_si128 (a, mask, mem_addr);
}
我希望在 __mmask16 和 __m128i 之间进行转换。但是,正如在
上发布的那样/* convert 16 bit mask to __m128i control byte mask */
_mm_maskz_broadcastb_epi8((__mmask16)mask,_mm_set1_epi32(~0))
_mm_maskz_broadcastb_epi8 以及类似的内容在 KNL 上尚不可用。 AVX512BW 在 KNL (Xeon Phi 7210) 上的缺失让我很头疼。
问题的根源是我想利用
_mm_maskmoveu_si128 (__m128i a, __m128i mask, char* mem_addr)
同时使用
__mmask16 len2mask[] = { 0x0000, 0x0001, 0x0003, 0x0007,
0x000F, 0x001F, 0x003F, 0x007F,
0x00FF, 0x01FF, 0x03FF, 0x07FF,
0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF,
0xFFFF };
如果您确实打算生成如下内容:
__m128i mask = _mm_maskz_broadcastb_epi8(len2mask[length],_mm_set1_epi32(~0))
为什么不只是:
void foo(int length, char* mem_addr, const __m128i a)
{
__m128i count = _mm_set_epi8(15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);
__m128i mask = _mm_cmpgt_epi8(_mm_set1_epi8(length), count);
_mm_maskmoveu_si128 (a, mask, mem_addr);
}