Устройство CUDA для размещения ошибки передачи данных

У меня проблема с получением данных устройства на хост. В приведенном ниже примере программы. Я создал массив hostData на хосте и предоставил ему значения. Затем я передаю hostData в переменную deviceData и снова передаю те же данные в новый массив данных хоста, т.е. hostDataFinal. и когда я напечатал значения, хранящиеся в hostDataFinal, до нескольких значений, вывод в порядке, остальное отображается как значение мусора. Все значения должны быть такими же, как в массиве hostData. Пожалуйста, помогите мне с этим.

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <iostream>

int main()
{
int totalData = 20;
int *hostData;
hostData = new int[totalData];
std::cout<<std::endl<<std::endl<<"HostData Values : "<<std::endl;
for (int i=0; i<totalData ;i++)
{
    hostData[i]= i+1;
    std::cout<<hostData[i]<<" "; 
}

int *deviceData;
int *hostDataFinal;
cudaMalloc((void**)&deviceData,totalData*sizeof(int));
hostDataFinal = new int[totalData];

cudaMemcpy(deviceData,hostData,totalData,cudaMemcpyHostToDevice);
cudaMemcpy(hostDataFinal,deviceData,totalData,cudaMemcpyDeviceToHost);

std::cout<<std::endl<<std::endl<<"HostDataFinal After Device Transfer Values : "<<std::endl;
for (int i=0; i<totalData ;i++)
{
    std::cout<<hostDataFinal[i]<<" "; 
}

free(hostData);
free(hostDataFinal);
cudaFree(deviceData);
return 0;

}

Вывод программы:

Значения HostData: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

Значения HostDataFinal после передачи устройства:

1 2 3 4 5 -842150451 -842150451 -842150451 -842150451 -842150451 -842150451 -842150451 -842150451 -842150451 -842150451 -842150451 -842150451 -842150451 -842150451 -842150451

Фактический результат должен быть:

Значения HostData: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

Значения HostDataFinal после передачи устройства:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

Спасибо за помощь.


person amsainju    schedule 06.12.2013    source источник


Ответы (1)


Ваша проблема в этих строках. Третий параметр в cudaMemcpy — это количество копируемых байтов.

cudaMemcpy(deviceData,hostData,totalData,cudaMemcpyHostToDevice);
cudaMemcpy(hostDataFinal,deviceData,totalData,cudaMemcpyDeviceToHost);

должно быть

cudaMemcpy(deviceData,hostData,totalData *sizeof(int),cudaMemcpyHostToDevice);
cudaMemcpy(hostDataFinal,deviceData,totalData*sizeof(int),cudaMemcpyDeviceToHost);

Также убедитесь, что вы обрабатываете коды ошибок возврата, как показано здесь

person Sagar Masuti    schedule 06.12.2013
comment
Если ваша проблема решена, не могли бы вы принять ответ. - person Sagar Masuti; 06.12.2013