Я использую cudaMallocPitch и cudaMemcpy2D в CUDA, но я не получаю правильный ответ! - PullRequest
1 голос
/ 24 июня 2011

Это мой код, инициализирующий матрицу d_ref и копирующий ее на устройство.Я не уверен, правильно ли я использую cudaMallocPitch и cudaMemcpy2D, но я пытался использовать cudaMemcpy2D и нижнюю страницу 20 Руководство по программированию CUDA

Все, что я получаю ввывод 0.

Что не так с моим кодом?и это лучший способ сделать эту работу?

Заранее спасибо.

__host__    

float *d_ref;

float **h_ref = new float* [width];
for (int i=0;i<width;i++)
    h_ref[i]= new float [height];

for (int i=0;i<width;i++){
    for (int j=0;j<height;j++){
        h_ref[i][j]=ref_list[j][i]; //transpose
    }   
}

size_t ref_pitch;

cudaMallocPitch(&d_ref, &ref_pitch, width * sizeof(float), height);

cudaMemcpy2D(d_ref, ref_pitch, h_ref, width*sizeof(float),width*sizeof(float), height*sizeof(float), cudaMemcpyHostToDevice);


lowerBound<<<grid, block>>>(d_ref, ...




__global__ void lowerBound (float* d_ref, ....


    float* ref = (float*)((char*)d_ref + blockIdx.x * ref_pitch);

    cuPrintf(" %f \n",ref[threadIdx.x]);

Ответы [ 2 ]

3 голосов
/ 09 декабря 2011

В этой строке:

cudaMemcpy2D (d_ref, ref_pitch, h_ref, ширина * sizeof (float), ширина * sizeof (float), высота * sizeof (float), cudaMemcpyHostToDevice);

почему вы умножаете height на sizeof(float)?Вы передаете слишком много данных!

1 голос
/ 24 июня 2011

Вызов cudaMemcpy2D в том виде, в котором он написан, предполагает, что h_ref является 2D-массивом элементов с плавающей запятой 'width' x 'height', хранящихся непрерывно, хотя на самом деле это 1D-массив указателей 'width'.

Вместо представления матрицы в виде одномерного массива векторов, я бы предложил хранить ее в одномерном массиве с плавающей точкой 'width' x 'height' и использовать макросы для доступа на основе строки, столбца.

...