現在、C++ AMP コードをタイル化しています。各タイルには、頻繁に読み取られる 4096 バイトのデータがあるため、これを tile_static として宣言したいと思います。各スレッドがすべてのデータにアクセスする必要があるため、これを複数のタイルに分割することは現実的ではありません。私のタイルは 128 のスレッドで構成されているため、Nvidia/AMD GPU では 2 ~ 4 回のワープが必要です。
次の記事を読んだところ、ワープごとに tile_static で 1024 ビットしか使用できないことが示唆されているようです 。 -on-tile-static-memory-with-c-amp.aspx
一部の最近の GPU では、tile_static メモリは、同時にアクセスできる「n」個の同じサイズのメモリ バンクで構成され、連続する「m」ビット ワードは連続するメモリ バンクにマップされます。tile_static メモリ (つまり n と m) の正確な構成は、ハードウェアに依存します。たとえば、Nvidia GTX 580 カードまたは ATI HD 5870 カードでは、tile_static メモリには32 のバンク (n = 32) があり、連続する 32 ビット ワード (m = 32) が連続するメモリ バンクにマップされるように構成されています。n はハードウェアによって異なる場合があることに注意してください。通常、m は 32 です。以降の投稿では、m が 32 であると仮定します。
これは、ワープごと、またはスレッドごとに最大 1024 ビットを宣言できるということですか? すべての tile_static 変数はワープ間で共有されていますか、それともワープごとに独自のコピーがありますか?
これらの質問のうち、ハードウェアに依存するものはどれくらいありますか?もしそうなら、実行時の制限をどのように見つけることができますか?
私はc++ AMP の本の表紙から表紙までを読みました。この主題を紹介してくれた著者には感謝していますが、この質問に対処しているようには見えませんでした (または、理解していたとしても理解できませんでした)。
tile_static メモリの使用方法に関する豊富な情報がオンラインにあります (これは良いスタートです: http://www.danielmoth.com/Blog/tilestatic-Tilebarrier-And-Tiled-Matrix-Multiplication-With-C-AMP .aspx ) しかし、どれだけ宣言できるかについて誰も話していないようで、実際にこのようなものを実装することは不可能です! その最後のリンクは、次の例を示しています。
01: void MatrixMultiplyTiled(vector<float>& vC,
const vector<float>& vA,
const vector<float>& vB, int M, int N, int W)
02: {
03: static const int TS = 16;
04: array_view<const float,2> a(M, W, vA);
05: array_view<const float,2> b(W, N, vB);
06: array_view<float,2> c(M,N,vC); c.discard_data();
07: parallel_for_each(c.extent.tile< TS, TS >(),
08: [=] (tiled_index< TS, TS> t_idx) restrict(amp)
09: {
10: int row = t_idx.local[0]; int col = t_idx.local[1];
11: float sum = 0.0f;
12: for (int i = 0; i < W; i += TS) {
13: tile_static float locA[TS][TS], locB[TS][TS];
14: locA[row][col] = a(t_idx.global[0], col + i);
15: locB[row][col] = b(row + i, t_idx.global[1]);
16: t_idx.barrier.wait();
17: for (int k = 0; k < TS; k++)
18: sum += locA[row][k] * locB[k][col];
19: t_idx.barrier.wait();
20: }
21: c[t_idx.global] = sum;
22: });
23: }
13 行目で 2x 1024 ビットが宣言されていることに注意してください。これにより、私の 4096 ビットは要求するほど多くないことが期待されます....C++ アンプまたは GPU プログラミング全般の経験がある人が私を助けてくれれば、それは素晴らしいことです- これらの質問は、AMP 言語拡張自体よりもハードウェア/実装に依存していると思います...