我正在研究 Rust 以重写 C++ 代码库,我想知道如何禁用循环展开/矢量化并控制展开计数。在 Clang 中我们会使用:
#pragma clang loop unroll(disable)
#pragma clang loop unroll(disable) vectorize(disable)
#pragma clang loop unroll_count(2)
这是对性能高度敏感的代码,无法控制循环代码生成可能会成为阻碍。
最佳答案
您无法控制给定循环的展开方式/不展开方式。它has been proposed ,但在考虑这样的 RFC 方面没有取得真正的进展,更不用说接受和实现它了。
如果您正在寻找非常广泛的功能,您可以将 -C llvm-args=...
传递给编译器以影响 LLVM。如果有一种方法可以完全禁用循环展开,那可能会做你想做的事。
从实用的角度来说,我鼓励您获得 walking skeleton在 Rust 中检查你的代码,看看性能是否可以接受。我的个人经验表明,“通用”Rust 代码性能更高,因为
- 借用检查器可以安全地积极使用引用而不是副本
- 相对容易使用多线程
- 有助于避免多次执行工作的强类型系统
关于performance - 如何禁用 Rust 中的循环展开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57183573/