gpt4 book ai didi

rust - 使用 Rust 自动矢量化

转载 作者:行者123 更新时间:2023-12-05 01:22:57 25 4
gpt4 key购买 nike

我是 rust/SIMD 的新手,我有以下代码片段作为我程序的瓶颈,我想知道我是否可以利用它的自动矢量化功能

fn is_subset(a: Vec<i64>, b: Vec<i64>) -> bool {
for i in 0..a.len() {
if (a[i] & !b[i]) != 0 {
return false;
}
}
true
}

我还有另一种编写方法(使用迭代器,因此可以预先知道行程计数),这会创建自动向量化吗?

fn is_subset(a: Vec<i64>, b: Vec<i64>) -> bool {
return a.iter().zip(b.iter()).all(|(x, y)| x & y == *x)
}

最佳答案

LLVM(和 GCC)不知道如何自动矢量化无法预先计算行程计数的循环。这排除了像这样的搜索循环。

ICC classic 可以自动向量化此类循环,但它是一个 C/C++ 编译器,没有 Rust 前端。

您唯一的希望可能是手动遍历数组的 2、4 或 8 个元素 block ,根据所有这些元素无分支地计算您的条件。如果幸运的话,LLVM 可能会将其转换为对一个 SIMD 向量的操作。因此,在更大的循环中使用该内部循环可能会导致编译器生成矢量化 asm,例如使用 AVX vptest(根据按位设置 CF a AND (not b) 有任何非零位)。

即针对特定的向量宽度,在您的源代码中手动表达 SIMD 元素的“展开”。

相关回复:让编译器使用 x86 ptest 自动向量化:

如果整个数组足够小,则编译器愿意对整个数组进行无分支归约(对 bool 结果进行 OR 运算)。如果针对 x86 进行编译,您希望在循环中使用 pandn/por 之类的 asm,并在末尾进行水平缩减,因此请查看是否设置了任何位anot b 的交集。

i64 每个 16 字节向量只有 2 个元素,因此编译器必须找到一个好的策略才能使其自动向量化有利可图,尤其是在 64 位机器上。提供 32 字节向量使其更具吸引力。

关于rust - 使用 Rust 自动矢量化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73118583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com