2

NVIDIA GeForce 9800 GT グラフィックス カード用に OpenCL 行列乗算プログラムを最適化しようとしています。2 つの 512x512 行列を乗算していますが、使用すべきグローバルおよびローカル ワーク グループのサイズがわかりません。誰かが私を正しい方向に向けることができますか?

4

3 に答える 3

3

5122の累乗であるため、次のサイズを試すことができます。

size_t global_work_size[2] = {512, 512};
size_t  local_work_size[2] = {2^p, 2^n};

どこ :

  • (2^m + 2^n) % 32 = 0:ラップにはスレッドが含まれるため、スレッド数の分割32数である必要があります。32

  • ローカル作業サイズはグローバル作業サイズの除算でなければならないため、2の累乗が必要です。

  • サイズが の場合、確かに問題にはなりませんが、 (によって与えられる) パラメータ512を考慮する必要があります。より大きな行列の場合は、複数の次元を使用する必要があります。CL_DEVICE_MAX_WORK_GROUP_SIZEclGetDeviceInfo()2

  • 次元数自体はCL_DEVICE_MAX_WORK_ITEM_DIMENSIONS...によって制限されます

実際、最良の選択はアルゴリズムに依存し、実行する行列乗算の種類によって異なります。

于 2013-04-11T13:52:13.813 に答える
1

Dithermaster に同意します。ピーク パフォーマンスはプラットフォームに大きく依存することを付け加えたいと思います。GPU が同じモデル/世代でない場合、同じベンダーの GPU であっても、最適なワーク グループ サイズが異なる可能性があります。

ピークのパフォーマンスを得るには、ターゲット プラットフォームで実験 (実行前のトレーニング) を行い、最適な構成を見つける必要があります。ワーク グループのサイズだけでなく、ワーク グループの形状もパフォーマンスに大きく影響する可能性があることに注意してください。そうは言っても、以下のすべての組み合わせを実際に試す必要があります。カーネルの最大ワーク グループ サイズが 1024 であるとします。これは、2 次元ワーク グループの場合、(1, 1024)、(2, 512)、(4, 256)、(8, 128)、(16, 64)、(32, 32)、(64, 16)、(128, 8)、(256, 4)、(512, 2)、および (1024, 1)。

(1, 1024) と (1024, 1) は、メモリ アーキテクチャ、キャッシュ アーキテクチャ、ウェーブのスケジュール方法などにより、まったく異なるパフォーマンスになる可能性があることに注意してください。

はい、もちろん、ウェーブ/ワープのサイズと合体したメモリ アクセスも考慮する必要があります。ここでは、一般的な OpenCL ワークロードについて話しているだけです。特に、ワークロードが構造パターンを示さない場合は、できるだけ多くの組み合わせを試して、何も見逃さないようにすることをお勧めします。

于 2016-04-13T21:27:51.363 に答える