GCCコンパイラでプログラムをコンパイルする際にGPUアクセラレーションを適用する方法やツールはありますか?現在、指定されたプログラムのリストを繰り返しコンパイルするプログラムを作成しました。数分かかります。ハッシュの事前計算にGPUアクセラレーションを適用するのに役立つPyritのようなプログラムをいくつか知っています。
そのようなツールが利用できない場合は、OpenCLなどを使用してコードを再プログラムするかどうかをアドバイスしてください。
A。命令型プログラミング言語では、ステートメントは順番に実行され、各ステートメントはプログラムの状態を変更する場合があります。したがって、翻訳単位の分析は本質的に連続しています。
例:定数伝播の仕組みを確認してください-
a = 5;
b = a + 7;
c = a + b + 9;
b
とc
に割り当てられた値がコンパイル時に定数であることを理解する前に、これらのステートメントを順番に確認する必要があります。
(ただし、別々の基本ブロックがコンパイルされ、互いに並行して最適化される場合があります。)
B。これに加えて、異なるパスも順次実行する必要があり、相互に影響します。
例:命令のスケジュールに基づいて、レジスタを割り当てた後、レジスタをメモリにスピルする必要があることがわかったため、新しい命令を生成する必要があります。これにより、スケジュールが再び変更されます。
したがって、「レジスタ割り当て」や「スケジューリング」などの「パス」を並行して実行することはできません(実際には、Ithink /数学者はこれらの2つの問題を一緒に解決しようとしましたが、それには入りません)。
(繰り返しますが、パスをパイプライン化することでsomeの並列性を実現できます。)
さらに、GPUは特に適合しません:
GPUは浮動小数点演算に適しています。コンパイラがあまり必要としない、または使用しないコンパイラ(プログラムで浮動小数点演算を最適化する場合を除く)
GPUはSIMDが得意です。つまり、複数の入力に対してsame操作を実行します。これもまた、コンパイラが行う必要のあることではありません。コンパイラが、たとえば数百の浮動小数点演算を最適化する必要がある場合、(が役立つ場合があります(ワイルドな例は、プログラマが複数のFP配列、それらに定数を割り当て、これらを操作するコードを作成しました。実際に非常に不適切に作成されたプログラムです。)
したがって、基本ブロックのコンパイルの並列化とパスのパイプライン化を除けば、「Cファイルのコンパイル内」のレベルではhadになるほどの並列性はありません。 。ただし、並列処理は可能で、実装が簡単で、常に高いレベルで使用されます。 GNU Make
は、たとえば、-j=N
引数。これは基本的に:N
の独立したジョブを見つける限り(通常、多くのファイルをコンパイルすることがGNU Make
はとにかく使用されます)、N
プロセス(またはN
の異なるインスタンスを並行してコンパイルするgcc
インスタンス)を生成します。
「GCCとLLVMで使用するGPUアクセラレーションコードを自動的に作成できますか?」答えはイエスです。 NVIDIAとGoogleは、オープンソースのLLVMベースのコンパイラプロジェクトを作成しています。
NVIDIA CUDA LLVM:
GOOGLE GPUCC:
あなたの質問が「GPUを使用して非CUDA汎用コードのコンパイルを高速化できますか?」現在、答えはノーです。 GPUは、並列タスクのような特定のものが得意であり、コンパイラーがすべてであるブランチのような特定のものが得意です。幸いなことに、CPUを搭載したPCのネットワークを使用して、コードの最適化に応じて2〜10倍のコンパイル速度を実現できます。また、デスクトップで使用可能な最速のマルチコアCPUと高速SSDを取得できますネットワーク構築に頼る前に手間をかけずに利益を得ることができます。
C/C++/ObjCコンパイラタスクをDistccなどのコンピューターのネットワークに配布するツールがあります。 XCodeの古いバージョンに含まれていましたが、削除されており、Swiftでの使用はサポートされていません。
Visual Studio C/C++およびLinux開発環境をサポートするIncredibuildと呼ばれるDistccに似た商用ツールがあります。
IncredibuildとDistccの実際の使用と、他のすべてを再コンパイルせずに単一ファイルの単一行のような小さな変更を行うネイティブコンパイラのインクリメンタルビルドサポートと比較したトレードオフについての良い記事があります。考慮すべき点: