1024 行列のフィットネス関数を実行しています。各行列は独自のブロックを取得し、同じサイズです。各ブロックにはn*n
スレッド (行列の次元)n*n
があり、合計を簡単に削減できるように共有メモリが必要です。ただし、すべての行列の次元n
は実行前に可変です (つまり、手動で変更できますが、常に 2 のべき乗であるため、合計は単純です)。ここでの問題は、定数を使用して共有メモリを割り当てる必要があることですが、ホストからカーネルに渡す値も必要です。n
(カーネルに渡すために) CPU に表示され、(カーネル内で) 共有メモリのサイズを宣言するために使用できるように、ディメンションをどこで宣言すればよいですか?
私のコードは次のように構成されています。
からmain.cu
カーネルを呼び出します:
const int num_states = 1024
const int dimension = 4
fitness <<< num_states, dimension * dimension >>> (device_array_of_states, dimension, num_states, device_fitness_return);
そして、kernel.cu
私は持っています:
__global__ void fitness(
int *numbers,
int dimension,
int num_states,
int *fitness_return) {
__shared__ int fitness[16]; <<-- needs to be dimension * dimension
//code
}
numbers
は 1024 の行列を表す配列dimension
です。 は行と列の長さです。num_states
は 1024 です。fitness_return
は長さ 1024 の配列で、各行列の適合値を保持します。カーネルでは、共有メモリは の 2 乗でハードコーディングされていますdimension
(dimension
この例では 4 です)。
dimension
共有メモリの割り当てとカーネルの呼び出しに使用できるように、どこでどのように宣言できますdimension
か?この方法では、1 か所で更新するだけで済みます。ご協力いただきありがとうございます。