【发布时间】:2016-02-15 05:37:16
【问题描述】:
我正在开发我的游戏项目(塔防),并尝试使用 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 ...我相当确定它与共享内存以及我处理它的方式有关,因为无论何时执行代码,重写代码以使用全局内存都会给出相同的结果。有什么想法吗?
【问题讨论】: