为什么2D数组未正确填充在我的代码中(使用CudaC)?

时间:2018-11-09 10:12:38

标签: c++ cuda gpu nvidia gpgpu

我只是在结果数组中添加一个2D数组(4x4),但是在输出中我只得到第一行,而其他3行返回一些垃圾值。 我猜可能是由于不确定网格大小和块大小的分配所致。 因为我是Cuda的新手,所以请引导我。

如果我的提问方式有问题,请纠正我,因为我是新来的。

 __global__ void d_EdgeDetect(float *org, float * result)
    {
        int row = blockIdx.x * blockDim.x + threadIdx.x;
        int col = blockIdx.y * blockDim.y + threadIdx.y;
        //int row = threadIdx.x;
        //i**strong text**nt col = threadIdx.y;
        int height = 4;
        int width = 4;    

        if (row < height && col < width)
        {
        int index = col + row * 4;          
            result[index] = org[index] + org[index];    
        }

    }

        int wdth = 4;
        int height = 4;
        int rng = 100;
    /* ******MAIN ***** */

        int main(int argc, char ** argv)
        {
            printf(" Starting program \n");
            int size = wdth * height;
            float * input = new float[size];
            float * output = new float[size];

            std::cout << "Input is: " << std::endl;
            for (int i = 0; i < size; i++)
            {
                input[i] = rand() % rng;
                std::cout << "at: " << i << " " << input[i] << std::endl;
            }

            float *dinput, *doutput;
            cudaMalloc((void **)& dinput, size * sizeof(float));
            cudaMalloc((void **)& doutput, size * sizeof(float));
            cudaMemcpy(dinput, input, size, cudaMemcpyHostToDevice);
            /* ******************** END setup work *************************** */
            /* ******************* Device processing ********** */    
            dim3 blocksize(4, 4);
            dim3 gridsize(4,4);
            printf(" Invoking Kernel \n");
            /* CUDA method */
            d_EdgeDetect << < gridsize, blocksize >> > (dinput, doutput/*, dwdth, dheight*/);
            cudaThreadSynchronize();
            printf(" Completed Kernel \n");


            cudaMemcpy(output, doutput, size,cudaMemcpyDeviceToHost);
            for (int i = 0; i < size; i++)
            {

                std::cout << "at: " << i << " " << output[i] << std::endl;
            }
            /* ************* END Device processing **************** */
          }

以下是代码的输出:

--------------------
at: 0 82
at: 1 134
at: 2 68
at: 3 0
at: 4 -4.31602e+08
at: 5 -4.31602e+08
at: 6 -4.31602e+08
at: 7 -4.31602e+08
at: 8 -4.31602e+08
at: 9 -4.31602e+08
at: 10 -4.31602e+08
at: 11 -4.31602e+08
at: 12 -4.31602e+08
at: 13 -4.31602e+08
at: 14 -4.31602e+08
at: 15 -4.31602e+08

2 个答案:

答案 0 :(得分:0)

cudaMemcpy(dinput, input, size, cudaMemcpyHostToDevice);

您忘记添加要复制的数据的大小。

cudaMemcpy(dinput, input, size * sizeof(float), cudaMemcpyHostToDevice);

(而且,这几乎是C代码,您甚至不时使用printf,没有用于存储数据的容器...)。

答案 1 :(得分:0)

cudaMemcpy文档中,您可以看到原型中的count是您要复制的字节总数。

cudaMemcpy ( void* dst, const void* src, size_t count, cudaMemcpyKind kind )

但是您仅复制了size个字节(即16个字节),因此只有output数组的前四个元素可以正确打印。

sizesizeof(float)相乘,以便您将复制并能够正确打印output数组的所有元素。