相关疑难解决方法(0)

使用SIMD(AVX2)进行稀疏阵列压缩

我有一个稀疏数组a(大多数为零):

unsigned char a[1000000]; 
Run Code Online (Sandbox Code Playgroud)

我想ba使用AVX2的Intel x64架构上使用SIMD指令的非零元素创建一个索引数组.我正在寻找有效如何做到的提示.具体来说,是否有SIMD指令来获取SIMD寄存器中连续非零元素的位置,是否连续排列?

c++ optimization simd sparse-array avx2

6
推荐指数
2
解决办法
1407
查看次数

Rust 获取 SIMD 向量中真实字节的索引

我想比较两个 16 字节的向量并获取每个匹配的索引。一个小例子来说明我想要的:

fn get_matching_idx(arr1: &[u8], arr2: &[u8]) {
    let vec1 = u8x16::load_aligned(arr1);    
    let vec2 = u8x16::load_aligned(arr2);
    let matches = vec1.eq(vec2);
    for i in 0..16 {
        if matches.extract_unchecked(i) {
            // Do something with the index
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,我只想对设置的索引“做某事”,而不是检查每一个索引(匹配的数量会很少)。

有没有办法使用内在函数来获取匹配索引,而不是迭代整个向量?以 gcc 为例,我可以使用_mm_movemask_epi8对向量进行位打包,然后重复应用 来__builtin_clz获取第一个设置位的索引(这对于我拥有的稀疏数字来说性能更高)。或者,我可以有一个查找表,它对我的​​位打包整数中的每个半字节执行正确的操作(例如此处的第一个答案)。

Rust 中是否有与这些指令等效的指令?

我正在针对 Intel x86-64 处理器进行编译,并且不需要跨平台支持。

注意:我更喜欢原生(安全)铁锈的解决方案,但这不是硬性要求。我可以编写不安全的 rust,甚至可以使用某种 FFI 链接到上述方法。

x86 simd intrinsics rust

5
推荐指数
1
解决办法
834
查看次数

标签 统计

simd ×2

avx2 ×1

c++ ×1

intrinsics ×1

optimization ×1

rust ×1

sparse-array ×1

x86 ×1