2

現在、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 言語拡張自体よりもハードウェア/実装に依存していると思います...

4

2 に答える 2

0

32kbです。制限に達すると、コンパイルしようとするとエラーが発生します。

エラーが発生しない場合は、問題ありません。大規模な配列を宣言することで自分でテストできるはずであり、制限がtile_static何であるかを知らせる怒ったメッセージが表示されるはずです。tile_static

于 2015-09-28T21:05:56.183 に答える