Почему 2D-массив не заполняется должным образом в моем коде (с использованием CudaC)? - PullRequest
0 голосов
/ 09 ноября 2018

Я просто складываю 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 голосов
/ 09 ноября 2018

Из документации cudaMemcpy видно, что count в прототипе - это общее количество байтов, которое вы хотите скопировать.

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

Но вы скопировали только size байтов, то есть 16 байтов, поэтому только первые четыре элемента массива output печатаются правильно.

Умножьте size на sizeof(float), чтобы вы могли копировать и иметь возможность печататьвсе элементы массива output правильно.

0 голосов
/ 09 ноября 2018
cudaMemcpy(dinput, input, size, cudaMemcpyHostToDevice);

Вы забыли добавить размер копируемых данных.

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

(также, это почти код C, вы даже время от времени используете printf, без контейнера для хранения данных ...).

...