8

上下文:我正在编写的 Objective-C 库中有几个循环,用于处理大型文本数组。我可以看到它现在以单线程方式运行。

我知道 LLVM 现在能够自动矢量化循环,如 Apple 在 WWDC 上的会议所述。然而,它的做法非常谨慎,原因之一是由于 CPU 流水线可能会修改变量。

我的问题:如何查看 LLVM 对我的代码进行矢量化的位置,更有用的是,我如何接收调试消息来解释为什么它不能对我的代码进行矢量化?我确定它是否可以看到为什么它不能自动矢量化它,它可以向我指出这一点,我可以进行必要的手动调整以使其可矢量化。

如果我没有指出这个问题已经或多或少地被问过,但在这里相当迟钝,我会失职。

4

3 回答 3

3

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)。实际的磁盘位置可通过brew info llvm33- 可能/usr/local/Cellar/llvm33/3.3/bin

2. 使用 homebrew llvm 和标志构建您正在优化的单个文件

如果您在 Xcode 中构建,您可以轻松地复制粘贴构建参数,并使用您的 clang++-3.3 而不是 Xcode 自己的 clang。

附加-mllvm -debug-only=loop-vectorize将为您提供自动矢量化报告。注意:这可能不适用于任何远程复杂的构建,例如,如果您有 PCH,但这是调整单个 cpp 文件以确保其正确矢量化的简单方法。

3.从新的llvm创建一个编译器插件

我能够通过 homebrew llvm 构建我的整个项目:

  1. 获取这个 Xcode 编译器插件:http ://trac.seqan.de/browser/trunk/util/xcode/Clang%20LLVM%20MacPorts.xcplugin.zip?order=name
  2. 修改与 clang 相关的路径以指向我的自制 llvm 和 clang bin 名称(通过附加“-3.3”)
  3. 将其放入/Library/Application Support/Developer/5.0/Xcode/Plug-ins/

重新启动 Xcode 应该会在可用编译器列表中显示此插件。此时,-mllvm -debug-only=loop-vectorize标志将显示自动矢量化报告。

我不知道为什么这没有在 Apple 版本中公开。

更新:这在 Xcode 的当前 (8.x) 版本中公开。唯一需要的是启用一个或多个loop-vectorize标志。

于 2014-03-07T21:21:06.767 回答
2
  • 识别成功的循环vectorized

    clang -Rpass=loop-vectorize
    
  • 标识矢量化失败的循环并指示是否指定了矢量化:

    clang -Rpass-missed=loop-vectorize 
    
  • 标识导致矢量化失败的语句:

    clang -Rpass-analysis=loop-vectorize
    

来源: http: //llvm.org/docs/Vectorizers.html#diagnostics

于 2016-04-05T03:57:37.610 回答
0

假设您正在使用opt并且您有 llvm 的调试版本,您可以按如下方式进行:

opt -O1 -loop-vectorize -debug-only=loop-vectorize code.ll

code.ll您要矢量化的 IR在哪里。

如果您使用clang,则需要使用选项传递-debug-only=loop-vectorize标志。-mllvm

于 2013-11-12T04:28:18.147 回答