8

私は OpenCL でアルゴリズムを作成しています。このアルゴリズムでは、すべてのワーク ユニットがデータのかなりの部分を記憶する必要があります。たとえば、カーネルごとに along[70]と a の間の何かを言います。long[200]

最近の AMD デバイスには 32 KiB の__localメモリがあり、これは (カーネルあたりの所定の量のデータに対して) 20 ~ 58 作業単位の情報を保存するのに十分です。ただし、アーキテクチャ (特にこの図)から私が理解していることから、各シェーダー コアには専用の量のプライベート メモリもあります。しかし、私はそのサイズを見つけることができません。

各カーネルのプライベート メモリの量を調べる方法を誰か教えてもらえますか?

HD7970 については、近いうちに購入する予定があるため、特に興味があります。

編集: 問題は解決しました。答えは付録 D にあります。

4

3 に答える 3

4

回答はコメントのユーザー talonmies によって提供されたので、ここで新しい回答に書き込んで質問を閉じます。

これらの値は、AMD APP OpenCL プログラミング ガイドの付録 D にあります。どうやら、AMD デバイスのレジスタは 128 ビット (4x32) であり、最新のすべてのハイエンド デバイスには 16384 個のレジスタがあるため、計算ユニットあたり 256KB という驚異的な量になります。

于 2012-03-01T12:16:47.640 に答える
0

79xx シリーズ カードのレジスタ ファイルのサイズに答えるには、GCN アーキテクチャに基づいているため、anandtech の画像によると 64KB です: http://www.anandtech.com/print/5261

各カーネルが使用するメモリの量を調べる方法についての質問に答えるには、カーネルで AMD APP Profiler を実行すると、カーネル占有セクションでカーネルが使用するスペースの量がわかります。

于 2012-02-20T14:50:24.780 に答える
0

__local メモリを探していると思います。それが、32KB のローカル データ ストレージが参照しているものです。デバイスをポーリングしてプライベートメモリの量を取得できるとは思いません。

NULL long* cl_mem 参照を渡してメモリを割り当てることができます。WI ごとに静的な量のメモリを使用するのが最善だと思います。各作業項目に long[200] が必要であると仮定すると、以下のコードを使用できます。LDS メモリを最大限に活用するために、作業を同じ (または同様の) メモリ要件を持つグループに分割することもお勧めします。

void __kernel(__local long* localMem, const int localMemPerItem
       //more args...
       )
{
  //host has 'passed' localMemPerItem*get_local_size() long values in as locamMem
  //this work item has access to all of it, but can choose to restrict
  //itself to only the portion it needs.
  //work group size will be limited to CL_DEVICE_LOCAL_MEM_SIZE/(8*localMemPerItem)
  int startIndex=localMemPerItem*get_local_id(0);
  //use localMem[startIndex+ ... ]
}
于 2012-02-17T18:41:18.013 に答える