【问题标题】:Is there a way to show where LLVM is auto vectorising?有没有办法显示 LLVM 在哪里自动矢量化?
【发布时间】:2013-11-22 07:16:57
【问题描述】:

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

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

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

如果我没有指出这个问题已经或多或少地被问过,但相当迟钝,here

【问题讨论】:

  • 上周在 LLVM 开发者会议上对 LLVM 和矢量化进行了很好的讨论。视频/幻灯片应该很快就会上传:llvm.org/devmtg/2013-11

标签: objective-c c loops llvm vectorization


【解决方案1】:

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。使用自制 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 标志。

【讨论】:

    【解决方案2】:
    • 识别成功的循环vectorized

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

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

      clang -Rpass-analysis=loop-vectorize
      

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

    【讨论】:

      【解决方案3】:

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

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

      code.ll 是您要矢量化的 IR。

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

      【讨论】:

      • 听起来 OP 是在 OSX 上开发的。将调试标志传递给 opt 似乎不适用于默认的 xcode 工具链 - 它似乎需要使用特殊标志构建的 opt。
      • @scztt 是的,需要有一个 llvm 的调试版本,很可能默认的 xcode 有一个发布版本。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多