GCC コンパイラでプログラムをコンパイルする際に GPU アクセラレーションを適用する方法またはツールはありますか? 現在、指定されたプログラムのリストを繰り返しコンパイルするプログラムを作成しました。数分かかります。ハッシュの事前計算に GPU アクセラレーションを適用するのに役立つ Pyrit のようなプログラムをいくつか知っています。
そのようなツールが利用できない場合は、コードを再プログラムするために OpenCL を使用するか、他のものを使用するかについてアドバイスをください。
GCC コンパイラでプログラムをコンパイルする際に GPU アクセラレーションを適用する方法またはツールはありますか? 現在、指定されたプログラムのリストを繰り返しコンパイルするプログラムを作成しました。数分かかります。ハッシュの事前計算に GPU アクセラレーションを適用するのに役立つ Pyrit のようなプログラムをいくつか知っています。
そのようなツールが利用できない場合は、コードを再プログラムするために OpenCL を使用するか、他のものを使用するかについてアドバイスをください。
A.命令型プログラミング言語では、ステートメントが順番に実行され、各ステートメントがプログラムの状態を変更する場合があります。したがって、翻訳単位の分析は本質的に逐次的です。
例:定数の伝播がどのように機能するかを確認してください -
a = 5;
b = a + 7;
c = a + b + 9;
b
およびに割り当てられた値c
がコンパイル時に定数であることを理解する前に、これらのステートメントを順番に実行する必要があります。
(ただし、個別の基本ブロックは、互いに並行してコンパイルおよび最適化される可能性があります。)
B.これに加えて、異なるパスも順次実行し、互いに影響を与える必要があります。
例: 命令のスケジュールに基づいてレジスタを割り当てた後、レジスタをメモリにスピルする必要があることが判明したため、新しい命令を生成する必要があります。これにより、再びスケジュールが変更されます。
したがって、「レジスタ割り当て」や「スケジューリング」などの「パス」を並行して実行することもできません (実際、コンピューター科学者/数学者がこれら 2 つの問題を一緒に解決しようとした記事があると思いますが、それには触れません)。 .
(ここでも、パスをパイプライン化することである程度の並列処理を実現できます。)
さらに、GPU は特に次の理由で適合しません。
GPU は浮動小数点演算が得意です。コンパイラが必要としない、またはあまり使用しないもの (プログラムで浮動小数点演算を最適化する場合を除く)
GPU は SIMD が得意です。つまり、複数の入力に対して同じ操作を実行します。これも、コンパイラが行う必要があることではありません。たとえば、コンパイラが数百の浮動小数点演算を最適化する必要がある場合、利点があるかもしれません (乱暴な例としては、プログラマーがいくつかの大きな FP 配列を定義し、それらに定数を割り当て、これらを操作するコードを書きました。非常によく書かれていないプログラムです。)
そのため、基本ブロックのコンパイルの並列化とパスのパイプライン化を除けば、「C ファイルのコンパイル内」のレベルでは並列化はあまり行われません。しかし、並列処理は可能で、実装が簡単で、より高いレベルで常に使用されます。GNU Make
たとえば、-j=N
引数があります。N
これは基本的に次のことを意味します:独立したジョブを見つける限り(通常、GNU Make
とにかく大量のファイルをコンパイルするために使用されます)、N
プロセス (または異なるファイルを並行してコンパイルするN
インスタンス) を生成します。gcc