我试图弄清楚如何运行LLVM的内置循环向量器。我有一个很小的程序,其中包含一个非常简单的循环(我曾经有过一些输出,这就是stdio.h尽管从未被使用但仍然被包括在内的原因):
1 #include <stdio.h>
2
3 unsigned NUM_ELS = 10000;
4
5 int main() {
6 int A[NUM_ELS];
7
8 #pragma clang loop vectorize(enable)
9 for (int i = 0; i < NUM_ELS; ++i) {
10 A[i] = i*2;
11 }
12
13 return 0;
14 }正如您所看到的,它根本没有任何用处;我只需要for循环就可以矢量化。我把它编译成LLVM字节码
clang -emit-llvm -O0 -c loop1.c -o loop1.bc
llvm-dis -f loop1.bc然后我将向量器应用到
opt -loop-vectorize -force-vector-width=4 -S -debug loop1.ll但是,调试输出提供了以下内容:
LV: Checking a loop in "main" from loop1.bc
LV: Loop hints: force=? width=4 unroll=0
LV: Found a loop: for.cond
LV: SCEV could not compute the loop exit count.
LV: Not vectorizing: Cannot prove legality.我在LLVM源代码中做了一些研究,看起来SCEV来自ScalarEvolution pass,它的任务是(除其他外)计数返回循环条件的后边缘数,在这种情况下(如果我没有弄错的话)应该是trip计数减去第一次行程(在本例中是9,999 )。我在一个更大的基准上运行这个传递,它在每个循环中给出了完全相同的错误,所以我猜它不是循环本身,而是我没有给它足够的信息。
我花了相当多的时间在文档和Google结果中寻找一个使用此转换的完整opt命令的示例,但到目前为止没有成功;我很想知道我可能遗漏了什么(我刚开始向矢量化代码,所以它可能是非常明显的)。
谢谢,
斯蒂芬
发布于 2014-11-18 18:21:58
矢量化取决于之前需要运行的其他优化的数量。它们在-O0中根本没有运行,因此您不能期望您的代码会在那里被“仅仅”向量化。
在optimized中添加-O2前循环矢量法将有帮助(确保您的'A‘数组是外部/以某种方式使用的,否则一切都会被优化)。
https://stackoverflow.com/questions/26988409
复制相似问题