这是我第一次尝试一个CUDA项目。这就是它应该做的:
然而,在新数组中的大约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;
}我怀疑我设置了设备的参数不正确,否则我会把一个特定于设备的关键字搞错或者忘记了关键的一步。有什么东西向你扑来吗?
发布于 2013-05-09 01:24:28
我不认为你能运行那么多线程,如果可以的话,这不是一个好主意。尝试将线程数设置为256 (2D为16x16),然后根据输入大小选择网格大小。
dim3 threads(256,1,1);
dim3 grid(arraysize/threads.x,1,1); //Careful of integer division, this is just for example另外,您的第二份副本是不正确的。您需要切换array和out_arrays
cudaMemcpy(outarrays[i], array, memsize, cudaMemcpyDeviceToHost);https://stackoverflow.com/questions/16452825
复制相似问题