8

コンテキスト: 私が書いている Objective-C ライブラリには、大きなテキスト配列の処理を扱うループがいくつかあります。現在、シングルスレッドで実行されていることがわかります。

WWDC での Apple のセッションで説明されているように、LLVM がループを自動ベクトル化できるようになったことを理解しています。ただし、その方法には非常に注意が必要です。理由の 1 つは、CPU のパイプライン処理によって変数が変更される可能性があるためです。

私の質問: LLVM がコードをベクトル化した場所を確認するにはどうすればよいですか? また、コードをベクトル化できない理由を説明するデバッグ メッセージを受け取るにはどうすればよいでしょうか? 自動ベクトル化できない理由がわかれば、それを指摘してくれるので、必要な手動調整を行ってベクトル化できるようにすることができます。

この質問が多かれ少なかれすでに尋ねられていることを指摘しなかった場合、私は怠慢になりますが、かなり鈍感です

4

3 に答える 3

3

Xcode が提供する標準の llvm ツールチェーンは、オプティマイザーからのデバッグ情報の取得をサポートしていないようです。ただし、独自のllvmをロールしてそれを使用する場合、上で提案されたmishrのようにフラグを渡すことができるはずです。私が使用したワークフローは次のとおりです。

1. homebrew を使用して、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 でビルドした場合は、ビルド パラメーターを簡単にコピー アンド ペーストして、Xcode 独自の clang の代わりに自分の clang++-3.3 を使用できます。

追加-mllvm -debug-only=loop-vectorizeすると、自動ベクトル化レポートが得られます。注: これは、リモートで複雑なビルド (PCH を使用している場合など) では機能しない可能性がありますが、単一の cpp ファイルを微調整して、正しくベクトル化されていることを確認する簡単な方法です。

3. 新しい llvm からコンパイラ プラグインを作成します。

次の方法で、自作llvmでプロジェクト全体をビルドできました。

  1. この Xcode コンパイラ プラグインを取得します: http://trac.seqan.de/browser/trunk/util/xcode/Clang%20LLVM%20MacPorts.xcplugin.zip?order=name
  2. 自家製のllvmおよびclang bin名を指すようにclang関連のパスを変更します(「-3.3」を追加することにより)
  3. 中に入れる/Library/Application Support/Developer/5.0/Xcode/Plug-ins/

Xcode を再起動すると、使用可能なコンパイラのリストにこのプラグインが表示されます。この時点で、-mllvm -debug-only=loop-vectorizeフラグは自動ベクトル化レポートを表示します。

これが Apple ビルドで公開されていない理由がわかりません。

更新: これは、Xcode の現在の (8.x) バージョンで公開されています。必要なのは、1 つ以上の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 に答える