私は自分のゲーム プロジェクト (タワー ディフェンス) に取り組んでおり、共有メモリを使用して JCuda ですべてのクレーターとタワーの間の距離を計算しようとしています。タワーごとに、N スレッドで 1 ブロックを実行します。ここで、N はマップ上の生き物の数に等しくなります。特定のブロックのすべてのクレーターとその塔の間の距離を計算し、これまでに見つかった最小の距離をブロックの共有メモリに保存します。私の現在のコードは次のようになります。
extern "C"
__global__ void calcDistance(int** globalInputData, int size, int
critters, int** globalQueryData, int* globalOutputData) {
//shared memory
__shared__ float minimum[2];
int x = threadIdx.x + blockIdx.x * blockDim.x;
int y = blockIdx.y;
if (x < critters) {
int distance = 0;
//Calculate the distance between tower and criter
for (int i = 0; i < size; i++) {
int d = globalInputData[x][i] - globalQueryData[y][i];
distance += d * d;
}
if (x == 0) {
minimum[0] = distance;
minimum[1] = x;
}
__syncthreads();
if (distance < minimum[0]) {
minimum[0] = distance;
minimum[1] = x;
}
__syncthreads();
globalOutputData[y * 2] = minimum[0];
globalOutputData[y] = minimum[1];
}
}
問題は、同じ入力を使用してコードを複数回再実行すると(各実行後にホストとデバイスの両方ですべてのメモリを解放します)、コードがブロック (タワー) 番号 > 27 に対して実行されるたびに異なる出力が得られることです。グローバルメモリを使用するようにコードを書き換えると、コードが実行されるたびに同じ結果が得られるため、共有メモリとそれを処理する方法に関係があると確信しています。何か案は?