CUDA 1-D阵列没有得到更新

时间:2013-05-09 01:18:53

标签: cuda

这是我第一次参加CUDA计划。这是它应该做的:

  1. 从主机内存接收1D像素阵列
  2. 每个Pixel由一个线程处理:它是线程安全的,因为只读取“val”并且只更新“newval”。等待同步。
  3. 每个Pixel由一个线程处理:将“newval”复制到“val。”
  4. 将此数组写回主机内存。
  5. 对几个不同的帧重复2-4次。
  6. 然而,接下来发生的事情是,新阵列中只有大约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;
    }
    

    我怀疑我是否错误地设置了设备的参数,否则我得到一个设备特定的关键字错误或忘记关键步骤。你有什么事吗?

1 个答案:

答案 0 :(得分:1)

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

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);