1

再帰ループで配列を計算するコードをCUDAで書く必要があります。この再帰ループのいくつかの中間ステップをその前に事前計算する可能性があります。つまり、ループ内の一部の計算を回避する定数配列とスカラーを割り当てます。

最初のアイデアは、スカラー パラメーターが CPU から GPU に毎回渡される一方で、定数配列をグローバル メモリに格納することでした (ここで提案されているように: CUDA and shared variables between different global functions )。

GPU 定数メモリの方が高速であるはずなので、使用してみたいと思います。ただし、私が見つけたいくつかのサンプル コードは、ホストから定数メモリを割り当てる方法を示しています。GPU から一定のメモリを割り当てること、つまりその値を計算することは可能ですか (グローバル メモリで行うように)? サンプルコードを教えてください。

編集: 多くの定数配列を割り当てることができたので、この状況ではテクスチャ メモリを使用する方がよいかもしれません。GPU からそこにメモリを割り当てる方法に関するサンプル コードはありますか?

4

3 に答える 3

2

最初の質問に答えるには:「GPU から一定のメモリを割り当てることは可能ですか」。短い答えはイエスです。他の人が答えたように、データをデバイスからデバイスの定数メモリにコピーします。

ここから、問題に必要なアクセス パターンとデータ量を考慮する必要があります。

定数メモリの場合、使用可能なメモリの量は 65536 バイトで、ワープ内のすべてのスレッドが同時に同じ要素にアクセスする場合、データはブロードキャストされます。ただし、64KB のメモリでは十分ではありませんでした。

テクスチャ メモリには、フィルタリングやキャッシュされる 2D 空間局所性などの特別な機能があります。そのため、3x3 ウィンドウの一般的なフィルタにテクスチャ メモリを使用するのが一般的な使用例です。

最後に、データを更新して一部のカーネル間で使用する必要がある場合、選択肢はグローバル メモリの使用になります。さらに、読み取り/書き込みテクスチャ メモリとして機能するサーフェス メモリ (CUDA C Programming Guire、第 3.2.10.2 章) を使用できます。

「再帰ループで配列を計算する CUDA でコードを作成する必要がある」の段階にあるため、最初にグローバル メモリを試して、将来の改善のベースを取得する必要があります。カーネルが動作すると、GPU メモリの最大のパフォーマンスを得るために、どのアクセスを別の方法で再配置または分散できるかがわかります。

最後に、新しい Fermi および Kepler アーキテクチャには、グローバル メモリ アクセス用の L1 および L2 キャッシュ階層が組み込まれていることを考慮してください。これにより、L1/L2 キャッシュの量が大きくなるため、ランダム アクセス パターンが軽減され、テクスチャ メモリよりも優れたパフォーマンスを発揮することさえあります。

最後に、CUDA SDK で多くのサンプル コードを見つけることができます。

于 2013-01-28T12:27:38.677 に答える
1

ここで読むことができるようcudaMemcpyToSymbolに、cudaMemcpyDeviceToDeviceフラグを使用すると、gpu から定数メモリにデータを直接コピーできるはずです。ただし、グローバル メモリの場合のように定数メモロイの日付を編集することはできません。そこから読み取ることしかできません。

于 2013-01-28T10:53:04.637 に答える
0

ホストから定数メモリの読み書きが可能です。デバイスから定数メモリを読み取ることしかできませんでした。

于 2013-01-28T10:55:29.243 に答える