3

マルチコア マシンを使用していますが、この古い C プログラム ( http://www.statmt.org/moses/giza/mkcls.html ) を実行しようとすると、1 つのコアしか使用しません。C コードを実行し、サイクル/スレッドを他のコアに送信する方法はありますか?

コードを CUDA に再コーディングすることが唯一の方法ですか?

4

3 に答える 3

5

マルチコア マシンを使用していますが、この古い C プログラム ( http://www.statmt.org/moses/giza/mkcls.html ) を実行しようとすると、1 つのコアしか使用しません。C コードを実行し、サイクル/スレッドを他のコアに送信する方法はありますか?

再コンパイルしなければ、間違いなくそうではありません。

いくつかの微調整を行い、ソースを取得して自動的に並列化するツールを使用できる場合がありますが、各コアは完全に分離されているため、「かなり離れている」ため、2 つのコア間で命令を分散させることはできません。 . コードは、2 つの「命令ストリーム」が存在するようにコンパイルする必要があります。デュアル コア システムの他のすべてのコアに 1 つおきの命令を送信すると、おそらく 10 倍から 100 倍遅くなります。コア間の通信に余分なオーバーヘッドが必要になるため、すべてのコードを 1 つのコアで実行します [各コアには、複数の命令を並行して実行する機能がすでにあります。

コードを CUDA に再コーディングすることが唯一の方法ですか?

いいえ、他にもたくさんの選択肢があります。OpenMP、複数のスレッドを使用したハンドコーディング。または、最も簡単な方法として、異なる入力データを使用してプログラムを 2 回または 4 回実行し、それらを完全に個別に実行します。これは明らかに、同時に複数のバリアントを実行できるものがある場合にのみ機能します...

「物事を平行にする」という言葉。すべてのコードを高速化する魔法のようなものではありません。前の計算の結果が必要な場所で何かを計算するのはかなり絶望的です-たとえば、フィボナッチ数列を計算したいと言います-f(n) = f(n-1) + f(n-2)並列計算ではそれを行うことができません.他の計算の結果が必要だからです.これを進めます。一方、素数であるかどうかを確認したい非常に大きな数が 12 個ある場合、4 コア プロセッサと 4 スレッドを使用すると、約 4 倍の速度で実行できます。

別の大きな行列またはベクトルで乗算する必要がある大きな行列がある場合は、分割して各コアで計算の一部を実行するのが理想的です。

特定のプロジェクトのコードは見ていませんが、説明を見るだけで、かなりうまく並列化できると思います。

于 2013-02-23T12:17:08.883 に答える
0

複数のプロセスで実行し、それらのプロセスのいずれかにタスクを転送する別のプログラムを作成できます。

クーダ?グラフィックカードで実行したい場合にのみ必要なので、この場合は意味がありません。

于 2013-02-23T12:30:24.913 に答える