有没有办法显示LLVM自动矢量化的位置?
上下文:我在Objective-C库中有几个循环,它处理大型文本数组。 我现在可以看到它以单线程方式运行。
据我所知,LLVM现在能够自动矢量化循环,如Apple在WWDC会议上所述。 然而,它的方式非常谨慎,其中一个原因是由于CPU流水线操作而导致变量被修改的可能性。
我的问题:我怎样才能看到LLVM在哪里对我的代码进行了矢量化,更有用的是,我如何才能收到解释为什么它无法对我的代码进行矢量化的调试消息? 我敢肯定,如果它能看出为什么它不能自动矢量化它,它可以指出我,我可以进行必要的手动调整,使其可以矢量化。
如果我没有指出这个问题已经或多或少已经被问过,而且非常迟钝,我会在这里失职。
Xcode提供的标准llvm工具链似乎不支持从优化器获取调试信息。 但是,如果你滚动自己的llvm并使用它,你应该能够像上面提到的mishr一样传递标志。 这是我使用的工作流程:
1.使用自制程序,安装llvm
brew tap homebrew/versions brew install llvm33 --with-clang --with-asan
这应该安装完整且相对较新的llvm工具链。 它链接到/usr/local/bin/*-3.3
clang++-3.3
(即clang++-3.3
)。 实际的磁盘位置可通过brew info llvm33
– 可能是/usr/local/Cellar/llvm33/3.3/bin
。
2.使用自制软件llvm和flags构建您正在优化的单个文件
如果你内置了Xcode,你可以轻松地复制粘贴构建参数,并使用你的clang ++ – 3.3而不是Xcode自己的clang。
附加-mllvm -debug-only=loop-vectorize
将为您提供自动矢量化报告。 注意:这可能不适用于任何远程复杂的构建,例如,如果你有PCH,但是这是一种调整单个cpp文件以确保它正确向量化的简单方法。
3.从新的llvm创建一个编译器插件
我能够通过以下方式使用自制软件llvm构建我的整个项目:
- 抓住这个Xcode编译器插件: http ://trac.seqan.de/browser/trunk/util/xcode/Clang%20LLVM%20MacPorts.xcplugin.zip?order =name
- 修改与clang相关的路径以指向我的自制llvm和clang bin名称(通过附加’-3.3’)
- 将它放在
/Library/Application Support/Developer/5.0/Xcode/Plug-ins/
重新启动Xcode应该在可用编译器列表中显示此插件。 此时, -mllvm -debug-only=loop-vectorize
标志将显示自动矢量化报告。
我不知道为什么这不会暴露在Apple版本中。
更新 :这在Xcode的当前(8.x)版本中公开。 唯一需要的是启用一个或多个loop-vectorize
标志。
-
标识成功
vectorized
循环:clang -Rpass=loop-vectorize
-
标识向量化失败的循环,并指示是否指定了向量化:
clang -Rpass-missed=loop-vectorize
-
标识导致矢量化失败的语句:
clang -Rpass-analysis=loop-vectorize
资料来源: http : //llvm.org/docs/Vectorizers.html#diagnostics
假设您正在使用opt
并且您拥有llvm的调试版本,则可以按如下方式执行:
opt -O1 -loop-vectorize -debug-only=loop-vectorize code.ll
其中code.ll
是您想要矢量化的IR。
如果使用clang
,则需要使用-mllvm
选项传递-debug-only=loop-vectorize
标志。