首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LLVM ScalarEvolution Pass不能计算环路向量器的出口计数

LLVM ScalarEvolution Pass不能计算环路向量器的出口计数
EN

Stack Overflow用户
提问于 2014-11-18 06:58:02
回答 1查看 411关注 0票数 0

我试图弄清楚如何运行LLVM的内置循环向量器。我有一个很小的程序,其中包含一个非常简单的循环(我曾经有过一些输出,这就是stdio.h尽管从未被使用但仍然被包括在内的原因):

代码语言:javascript
复制
  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字节码

代码语言:javascript
复制
clang -emit-llvm -O0 -c loop1.c -o loop1.bc
llvm-dis -f loop1.bc

然后我将向量器应用到

代码语言:javascript
复制
opt -loop-vectorize -force-vector-width=4 -S -debug loop1.ll

但是,调试输出提供了以下内容:

代码语言:javascript
复制
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命令的示例,但到目前为止没有成功;我很想知道我可能遗漏了什么(我刚开始向矢量化代码,所以它可能是非常明显的)。

谢谢,

斯蒂芬

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-18 18:21:58

矢量化取决于之前需要运行的其他优化的数量。它们在-O0中根本没有运行,因此您不能期望您的代码会在那里被“仅仅”向量化。

在optimized中添加-O2前循环矢量法将有帮助(确保您的'A‘数组是外部/以某种方式使用的,否则一切都会被优化)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26988409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档