2013-05-09 29 views
0

这是我第一次尝试CUDA程序。这是它应该做的:CUDA 1-D数组未更新

  1. 接收来自主机内存
  2. 每个像素由一个线程处理1D像素阵列:它是线程安全的,因为只有“VAL”为阅读与“的newval”是更新。等待同步。
  3. 每个像素由一个线程处理:将“newval”复制到“val”。
  4. 将此数组写回主机内存。
  5. 为几个不同的帧重复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; 
} 

我有一个怀疑,我的设备不正确地设置参数,否则我得到的特定设备的关键字错误的一个或忘记了关键的一步。有什么东西会跳出来吗?

+0

您需要网格。 – Constantin 2013-05-09 01:22:47

回答

1

我不认为你可以运行那么多线程,如果可以的话,它不是一个好主意。尝试将线程数设置为256(2D为16x16),然后根据输入大小选择网格大小。

dim3 threads(256,1,1); 
dim3 grid(arraysize/threads.x,1,1); //Careful of integer division, this is just for example 

此外,您的第二个副本不正确。您需要切换arrayout_arrays

cudaMemcpy(outarrays[i], array, memsize, cudaMemcpyDeviceToHost); 
+0

D'oh。我应该抓住那个错误的cudaMemcpy ......当然,那是问题所在。谢谢。 现在,关于主题......它没有给我一个这个数字的问题;你能解释为什么这是一个问题吗? 最后,我需要在运行第二个内核之前等待所有线程完成。我可以将它们合并,然后在两者之间添加cudaThreadSynchronize? – 2013-05-09 01:33:37

+0

弗兰克你应该肯定修复这些线索,让我看看我能不能找到你的文章.... – Constantin 2013-05-09 01:34:26

+0

http://stackoverflow.com/questions/4391162/cuda-determining-threads-per-block-blocks -per-grid – Constantin 2013-05-09 01:35:12