首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有一个内禀函数使__m128i向量的最后n个字节为零?

问是否有一个内禀函数使__m128i向量的最后n个字节为零?
EN

Stack Overflow用户
提问于 2020-08-25 15:38:30
回答 2查看 224关注 0票数 2

给定n,我希望将__m128i向量的最后一个n字节归零。

例如,考虑以下__m128i向量:

11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111

将最后一个n = 4字节归零后,向量应该如下所示:

11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 00000000 00000000 00000000 00000000

是否有一个SSE内禀函数可以这样做(通过接受__128i向量和n作为参数)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-25 19:25:44

有各种不依赖AVX512的选项。例如:

非对齐负载

代码语言:javascript
复制
char mask[32] = { 0, 0, 0, 0, 0, 0, 0, 0,
                  0, 0, 0, 0, 0, 0, 0, 0,
                  -1, -1, -1, -1, -1, -1, -1, -1,
                  -1, -1, -1, -1, -1, -1, -1, -1};

__m128i zeroLowestNBytes(__m128i x, uint32_t n)
{
    __m128i m = _mm_loadu_si128((__m128i*)&mask[16 - n]);
    return _mm_and_si128(x, m);
}

使用AVX,加载可以成为vpand的内存操作数。如果没有AVX,movdqu和pand仍然很好。

负载不对齐通常不是一个问题,除非它跨越4K边界。如果你能让mask 32对齐,那么这个问题就会消失。负载仍然是不对齐的,但不会碰到特定的边缘情况。

n是一个避免符号扩展的uint32_t。

广播比较

代码语言:javascript
复制
__m128i zeroLowestNBytes(__m128i x, int n)
{
    __m128i threshold = _mm_set1_epi8(n);
    __m128i index = _mm_set_epi8(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
    return _mm_andnot_si128(_mm_cmpgt_epi8(threshold, index), x);
}

这样可以避免未对齐的负载,但这并不重要。更重要的是,它避免了“输入依赖负载”:在带有未对齐负载的版本中,加载依赖于n。在这个版本中,加载独立于n。例如,如果此函数是内联的,则允许编译器将其从循环中吊起。它还允许无序执行更多的自由,以便尽早启动加载,也许在计算n之前。

另一方面,它基本上需要AVX2或SSSE3才能很好地实现_mm_set1_epi8(n)。而且,这通常需要更多的指令,这可能会使吞吐量更差。延迟应该更好,因为在“主链”中没有负载(有一个负载,但它位于一边,它不会将其延迟添加到计算的延迟中)。

票数 5
EN

Stack Overflow用户

发布于 2020-08-25 16:03:43

您应该能够通过使用_mm_mask_set1_epi8内禀向矢量末尾的所需字节“广播”零来达到预期的结果:

代码语言:javascript
复制
__m128i _mm_mask_set1_epi8 (__m128i src, __mmask16 k, char a)

  • src is __m128i vector
  • __mmask16是从n as (1 << n) - 1构造的,即在end
  • char a是0

上有n的掩码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63582402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档