【问题标题】:Convert 16 bit mask (__mmask16) to __m128i control byte mask on KNL (Xeon Phi 7210)在 KNL (Xeon Phi 7210) 上将 16 位掩码 (__mmask16) 转换为 __m128i 控制字节掩码
【发布时间】: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.

标签: xeon-phi avx512


【解决方案1】:

如果你真的打算生成类似的东西:

__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);
}

Godbolt demonstration.

【讨论】:

    猜你喜欢
    • 2021-07-15
    • 1970-01-01
    • 2010-12-02
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 2022-10-18
    • 1970-01-01
    • 2020-09-10
    相关资源
    最近更新 更多