我希望在使用gcc 11.1(编译选项为
-O3 -mavx -std=c++17
)的情况下,用C++编写以下函数。void f( float * __restrict__ a, float * __restrict__ b, float * __restrict__ c, int64_t n) {
for (int64_t i = 0; i != n; ++i) {
a[i] = b[i] + c[i];
}
}
这将生成大约60行汇编代码,其中许多处理n不是8的倍数的情况。https://godbolt.org/z/61MYPG7an
我知道n
始终是8的倍数。我可以更改此代码的一种方法是使用for (int64_t i = 0; i != (n / 8 * 8); ++i)
替换for (int64_t i = 0; i != n; ++i)
。这只会生成大约20个汇编指令。https://godbolt.org/z/vhvdKMfE9
然而,在第二个godbolt链接的第5行,存在一个指令用于清零n
的最低三位。如果有一种方法可以告知编译器n
将始终是8的倍数,则可以省略此指令而不会改变行为。是否有人知道在任何c或c++编译器上(特别是在gcc或clang上)如何做到这一点?在我的情况下,实际上并不重要,但我很感兴趣,也不确定该去哪里寻找答案。
#include <immintrin.h>
,为什么不直接使用这些内嵌函数呢? - Vlad Feinstein