我正在研究我的游戏项目(塔防),我试图使用共享内存计算所有小动物和带有 JCuda 的塔之间的距离。对于每座塔,我用 N threds 运行 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 时,我都会得到不同的输出。 .我相当确定它与共享内存和我处理它的方式有关,因为无论何时执行代码,重写代码以使用全局内存都会给出相同的结果。有任何想法吗?