这是我第一次尝试 CUDA 程序。这是它应该做的:
- 从主机内存接收一维像素阵列
- 每个像素由一个线程处理:它是线程安全的,因为只读取“val”,只更新“newval”。等待同步。
- 每个 Pixel 由一个线程处理:将“newval”复制到“val”。
- 将此数组写回主机内存。
- 对几个不同的帧重复 2-4。
然而,发生的情况是,新数组中大约 32000 个变量中只有几个变量似乎具有不错的值。其余为零。
为简洁起见,我删除了计算。
__global__ void kernel(Pixel *array, float dt)
{
const unsigned int tid = threadIdx.x;
Pixel *point = array + tid;
//DO A BUNCH OF CALCULATIONS ON PIXEL KIND OF LIKE THIS
point->newval = point->val + foo;
}
__global__ void copykernel(Pixel *array)
{
const unsigned int tid = threadIdx.x;
Pixel *point = array + tid;
//COPY THE NEWVALS OVER TO THE OLD VALS IN PREPARATION FOR THE NEXT FRAME
point->val = point->newval;
}
extern "C" bool runIt(const int argc, const char **argv, Pixel *inarray, Pixel **outarrays, int arraysize, int numframes, float dt)
{
int memsize = arraysize*sizeof(Pixel);
int i=0;
Pixel *array;
cudaMalloc((void **) &array, memsize);
cudaMemcpy(array, inarray, memsize, cudaMemcpyHostToDevice);
int numthreads = arraysize;
dim3 grid(1,1,1);
dim3 threads(numthreads,1,1);
for(i=0;i<numframes;i++)
{
kernel<<<grid, threads>>>((Pixel *) array, dt);
cudaThreadSynchronize();
copykernel<<<grid, threads>>>((Pixel *) array);
cudaThreadSynchronize();
cudaMemcpy(array, outarrays[i], memsize, cudaMemcpyDeviceToHost);
}
cudaFree(array);
return true;
}
我怀疑我为设备设置的参数不正确,或者我将某个设备特定的关键字弄错了,或者忘记了关键步骤。有什么东西冲着你跳出来吗?