【发布时间】:2017-03-16 11:01:59
【问题描述】:
我希望在 __mmask16 和 __m128i 之间进行转换。但是,正如在https://stackoverflow.com/a/32247779/6889542 发布的那样,
/* convert 16 bit mask to __m128i control byte mask */
_mm_maskz_broadcastb_epi8((__mmask16)mask,_mm_set1_epi32(~0))
_mm_maskz_broadcastb_epi8 和任何类似的东西在 KNL 上尚不可用。 KNL (Xeon Phi 7210) 上缺少 AVX512BW 真的让我很头疼。
问题的根源是我想利用
_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 };
【问题讨论】:
-
可能有点晚了,但我建议像你的
__mmask16 len2mask表一样简单地预先计算一个__m128i len2maskvector表并直接获取你想要的向量。这以缓存中 224 个额外字节为代价节省了一条指令。如果您需要戴上口罩:kmov, popcnt (or lzcnt), loada.