私はOpenCLの初心者で、学び始めたばかりです。GPUでいくつかのスレッドを実行し、CPUで残りのスレッドを実行できるかどうかを知りたいですか?言い換えれば、100スレッドを起動して8コアCPUを使用していると仮定すると、100スレッドのうち8スレッドがCPUで実行され、残りの92スレッドがGPUで実行される可能性がありますか?OpenCLはこのジョブの実行に役立ちますか?スムーズに?
3 に答える
GPU で少数のスレッドを実行し、CPU で残りのスレッドを実行できるかどうかを知りたいですか?
はい
つまり、100 スレッドを起動し、8 コア CPU を使用していると仮定すると、100 スレッドのうち 8 スレッドが CPU で実行され、残りの 92 スレッドが GPU で実行される可能性はありますか?
いいえ。その説明は、GPU と CPU を単一のコンピューティング リソースと見なすことを示唆しています。そんなことはできません。
これは、両方が同じタスクに取り組むことができないという意味ではありません。
- GPU と CPU は別個の OpenCL デバイスと見なされます。
- 複数のデバイスと通信できるコードを記述できます。
- 複数のデバイスに対して同じカーネルをコンパイルできます。
- 複数のデバイスに同時に作業を依頼できます。
...しかし...
- これはどれも自動ではありません。
- OpenCL は、単一の NDRange (または同等の) 呼び出しを複数のデバイス間で分割しません。
- これは、2 つのデバイス間で自分でタスクをスケジュールする必要があることを意味します。
- 速度にかなり大きな差が生じるため、最適な状態に保つには、「ここで 92、あちらで 8」以上の速度が必要になります。
私が見つけたのは、GPU が動作している間に CPU を別のタスクで動作させることです。GPU の次の作業を準備したり、GPU からの結果を後処理したりします。場合によっては、これは通常のコードです。時々それはOpenCLです。
複数の openCL デバイスを使用してアルゴリズムを処理できますが、デバイス間の作業が適切にバランスされるようにワークロードを十分に細かく分割する必要があります。そうしないと、オーバーヘッドによってランタイムが悪化する可能性があります。
複数の OpenCL デバイスの使用については、 AMD OpenCL プログラミング ガイドのセクション 4.7で明確に述べられているので、私の答えは、はい、複数のデバイスで実行する作業をスムーズに分割できます。全体のバランスをとります。
openCL コードは、選択したデバイス (CPU、GPU のモデル) 用に実行時にコンパイルされます。
異なるタスクに使用するターゲットを切り替えることはできますが、(私が知っている実装では) CPU と GPU の間で同じタスクを分割することはできません