2

ArrayFire for Python で複数のホスト スレッドを使用することについて、初心者から質問があります。現在、Open MPI と mpi4py を使用して並列化された、高度に並列化された CPU のみのコードがあります。各 CPU スレッドは大規模な行列乗算を実行し、多くの場合、複数のスレッドが同時に乗算されます。ArrayFire を使用して単一の GPU で行列乗算を実行することにより、パフォーマンスを向上させたいと考えています。

複数の CPU ホスト スレッドが行列乗算ジョブを GPU に送信し、GPU にこれらの乗算を同時に実行させることができるかどうかを把握しようとしています。それとも、各 CPU ホスト スレッドは、GPU がアイドル状態になるまで、乗算ジョブを GPU に送信する必要がありますか?

GPU コンピューティングの言語に精通していないため、答えを見つけるのに苦労しています。特定の GPU がカーネルの同時実行をサポートしているというのが私の印象ですが、私たちの GPU (Radeon Vega 10) がサポートしているかどうかを判断することはできませんでした。

ArrayFire for Python でこのようなことを行う方法に関する一般的なヒントやリソースをいただければ幸いです。

4

1 に答える 1

1

行列の乗算は GPU で非常に高速です。一般に、行列演算を行うために GPU に切り替えることは適切な決定です。ご質問に順番にお答えします。ここで述べていることのほとんどは、AMD と NVIDIA GPU の両方に当てはまることに注意してください。

はい、前のジョブが完了するのを待たずに、同じカーネルの複数のインスタンスをキューに入れることができる複数のホスト スレッドを起動できます。すべてのカーネルの起動は本質的に非同期であるため、カーネルをデバイスのキューに入れても実行がブロックされることはありません。すべてのカーネルの起動は、GPU での将来の実行のためにキューに入れられます。問題は、これらすべてのカーネルが同時に実行されるかどうかです。これは、単一のカーネル インスタンスに必要なリソースに完全に依存しています。GPU が同時に 2 つのカーネル実行に対応できる場合は、自動的に実行されます。これを決定するカーネルの起動に必要なリソースの種類は、起動されたブロックの数、共有メモリ、定数メモリなどです。

カーネルの同時実行は、単一のカーネル インスタンスが必要とするリソースの量に完全に依存します。また、同じキューに入れられたすべてのカーネルが順番に実行されるため、各カーネル インスタンスは個別のキュー (OpenCL キュー) で起動する必要があります。

ArrayFire を効率的に使用するには、ここにリストされているチュートリアルを実行することをお勧めします。各カーネルを個別のキューで起動できるマルチスレッド ソリューションをセットアップするには、チュートリアルの次の 2 つのセクション、特に 2 番目のセクションに集中する必要があります。

  1. 配列と行列の操作
  2. OpenCL の相互運用性

ドキュメント内の例のほとんどは C++ で書かれていますが、一般的な原則は Python ラッパーにも適用されます。Python ラッパーに固有の質問がある場合は、ここに投稿できます

于 2018-01-17T03:44:52.243 に答える