当前位置: 首页 > 知识库问答 >
问题:

使用AVX2可以实现对字数组的LZCNT的更快处理吗?

鲜于凯康
2023-03-14

我需要用LZCNT反向位扫描一个字数组:16位。

共有1个答案

师承弼
2023-03-14
#include <immintrin.h>

__m256i avx2_lzcnt_epi16(__m256i v) {
    const __m256i lut_lo = _mm256_set_epi8(
        4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 16,
        4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 16
    );
    const __m256i lut_hi = _mm256_set_epi8(
        0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 16,
        0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 16
    );
    const __m256i nibble_mask = _mm256_set1_epi8(0x0F);
    const __m256i byte_offset = _mm256_set1_epi16(0x0008);
    __m256i t;

    t = _mm256_and_si256(nibble_mask, v);
    v = _mm256_and_si256(_mm256_srli_epi16(v, 4), nibble_mask);
    t = _mm256_shuffle_epi8(lut_lo, t);
    v = _mm256_shuffle_epi8(lut_hi, v);
    v = _mm256_min_epu8(v, t);

    t = _mm256_srli_epi16(v, 8);
    v = _mm256_or_si256(v, byte_offset);
    v = _mm256_min_epu8(v, t);

    return v;
}

// 16 - lzcnt_u16(subwords)
__m256i avx2_ms1b_epi16(__m256i v) {
    const __m256i lut_lo = _mm256_set_epi8(
        12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 10, 10, 9, 0,
        12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 10, 10, 9, 0
    );
    const __m256i lut_hi = _mm256_set_epi8(
        16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 14, 14, 13, 0,
        16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 14, 14, 13, 0
    );
    const __m256i nibble_mask = _mm256_set1_epi8(0x0F);
    const __m256i adj = _mm256_set1_epi16(0x1F08);
    __m256i t;

    t = _mm256_and_si256(nibble_mask, v);
    v = _mm256_and_si256(_mm256_srli_epi16(v, 4), nibble_mask);
    t = _mm256_shuffle_epi8(lut_lo, t);
    v = _mm256_shuffle_epi8(lut_hi, v);
    v = _mm256_max_epu8(v, t);

    t = _mm256_srli_epi16(v, 8);
    v = _mm256_sub_epi8(v, adj);
    v = _mm256_max_epi8(v, t);

    return v;
}

对于打包到uint8中的结果,请使用_mm256_packs_epi16()。对于按正确顺序打包的结果,还可以使用_mm256_permute4x64_epi64()

R/SIMD解决方案。在这里的评论中也描述了这个解决方案。

 类似资料:
  • 现在我正在用Apache Kafka做一些测试。在Kafka生产者的配置中,参数batch.size和linger.ms控制批处理策略。是否可以在生产的同时动态地制作这些参数?例如。如果数据摄取率上升很快,我们可能希望增加batch.size以每批积累更多的消息。我没有找到任何动态批处理与Kafka生产者的例子。有没有可能实施?

  • 本文向大家介绍pandas针对excel处理的实现,包括了pandas针对excel处理的实现的使用技巧和注意事项,需要的朋友参考一下 本文主要介绍了pandas针对excel处理的实现,分享给大家,具体如下: 读取文件 数值处理 获取数据 loc和iloc详解 多行 输出行号和列号 获取指定值 基本格式化 数据多表合并 到此这篇关于pandas针对excel处理的实现的文章就介绍到这了,更多相关

  • 问题内容: 这是对该问题的后续跟踪 因此,首先,您会注意到无法对要连接的字符串列表执行,python告诉您改为使用,这是个好建议,因为无论您如何在字符串上使用,性能都很差。 “不能使用”限制不适用于,尽管这是执行这种列表平整的首选方法。 但是什么时候是列表绝对是不好的。 但是它应该保持这种状态吗? 我比较了三种方法 结果: 在清单清单上:10.46647310256958。好吧,我们知道。 :0.

  • 问题内容: 我知道JAXB(用于XML绑定的Java体系结构)可以编组/ 取消编组java.util.Date对象,如Blaise Doughan的回答所示 。 但有关新东西java.time包中的对象的Java 8,如?JAXB是否已更新以处理此新内置数据类型? 问题答案: 在Java SE 8中,JAXB尚未更新以支持 java.time 类型。 实际上,在参考实现中存在与此相关的问题。 您需

  • 本文向大家介绍C#实现对Json字符串处理实例,包括了C#实现对Json字符串处理实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现对Json字符串处理方法,分享给大家供大家参考。具体分析如下: 一般对于web应用开发人员来说对Json字符串都会很熟悉,其实在很多请求我们返回的都是Json字符串。那对于C#代码如何处理Json字符串呢,.Net封装了一个类叫做JavaScript

  • 通常,列表可以实现为链表(遍历速度较慢),也可以实现为数组列表(插入元素时速度较慢)。 我想知道是否有可能使用处理器的MMU来更有效地实现列表,只要插入或删除一个元素,就可以重新映射而不是复制内存。这意味着数组中任何地方的索引和插入/删除速度都要达到O(1),比任何其他列表实现都要好。 我的问题是: 程序是否真的能够控制自己的虚拟内存,或者是否需要对操作系统进行更改 每个进程的页表条目数是否有限制