我在检索设备数据到主机时遇到问题。 在下面的示例程序中..我在主机中创建了一个hostData数组并为其提供了值。 然后我将hostData转移到deviceData变量,并再次将相同的数据传输到新的主机数据数组即ie。 hostDataFinal。当我将存储在hostDataFinal中的值打印到几个值时,输出就可以了,rest显示为垃圾值。所有值都应与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
感谢您的帮助。
答案 0 :(得分:4)
你的问题在于这些问题。 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);
还要确保处理返回错误代码,如here
所示