私は1024行列の適合関数を実行しています。各行列は独自のブロックを持ち、同じサイズです。各ブロックはn*n
のスレッド(行列の次元)を持ち、n*n
共有メモリを持つ必要がありますので、簡単に合計を減らすことができます。しかし、すべての行列の次元n
は、実行時に変更可能です(つまり、手動で変更できますが、常に2の累乗であるため、合計は簡単です)。ここで問題となるのは、共有メモリは定数を使って割り当てなければならないが、ホストからカーネルに渡すための値も必要であるということです。サイズn
はどこで(カーネルに渡すために)CPUに認識され、(カーネル内で)共有メモリのサイズを宣言するために使用できるように宣言しますか?私のコードは、このような構造になってCUDA共有メモリ割り当ての定数を宣言する場所
:
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
に私が持っている::
main.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の配列。カーネルでは、共有メモリはdimension
の2乗でハードコーディングされています(dimension
はこの例では4です)。
dimension
はどこで共有メモリを割り当てるだけでなく、カーネルを呼び出すために使うことができるのですか?私はdimension
を1か所で更新すればよいのですか?ご協力いただきありがとうございます。
私の答えを編集しました。 – einpoklum
グローバルスコープで宣言してから使用してください。 –
この場合テンプレートパラメータはあなたの友人です – talonmies