私は奇妙な問題を抱えているので、私より経験豊富な誰かが解決策を見つけることができるかどうか尋ねてみようと思いました。
私はCUDAC/ C ++でプログラムを書いていますが、計算の境界の座標など、さまざまなものを指定する定数整数がいくつかあります。現在、それらはグローバルデバイスメモリにあります。それらはすべてのカーネル呼び出しのすべてのスレッドによってアクセスされるので、それらがグローバルメモリにある場合、それらはキャッシュまたはブロードキャストされないことがわかりました(右?)。したがって、これらの小さな整数は(比較的)多くのオーバーヘッドを占めており、多くの「読み取りの冗長性」があります。
だから私はヘッダーで宣言します:
__constant__ int* number;
私はそのヘッダーを含めます、そして、私が記憶のことをするとき、私はします:
cutilSafeCall( cudaMemcpyToSymbol(number, &(some_host_int), sizeof(int) );
number
次に、すべてのカーネルに渡します。
__global__ void magical_kernel(int* number, ...){
//and I access 'number' like this
int data_thingy = big_array[ *number ];
}
コードがクラッシュします。グローバルメモリに数値があるので、問題ありません。カーネル内の番号にアクセスすると、いつかクラッシュすることがわかりました。これは、アクセスしているか、割り当てが間違っていることを意味します。間違った値を保持していると、配列へのインデックス作成に使用されるため、クラッシュも発生します。
結論として、私はいくつかの質問をします。まず、私は何が間違っているのですか?number
ボーナスとして:このタスクを実行するための一定のメモリよりも優れた方法はありますか?コンパイル時の値がわからないため、単純な#defineは機能しません。コンスタントメモリはコードをまったく高速化しますか、それともキャッシュされてずっとブロードキャストされていますか?どういうわけか、各スレッドブロックの共有メモリにデータを入れて、複数のカーネル呼び出しを通じて共有メモリに残しておくことができますか?