如何提高内存使用性能?

时间:2015-10-13 06:47:36

标签: c++ cuda

我有一些数据:

MyDataType *deviceData, *hostData;

我为主机数据分配了固定内存,为设备数据分配了内存:

cudaMallocHost(&hostData, dataSize * sizeof(MyDataType));
cudaMalloc(&deviceData, dataSize * (MyDataType));

然后我处理这些数据。每一步我都会将数据上传到CUDA,处理数据并从CUDA下载数据:

cudaMemcpy(deviceData, hostData, dataSize * sizeof(MyDataType), cudaMemcpyHostToDevice);

//processing data

cudaMemcpy(hostData, deviceData, dataSize * sizeof(MyDataType), cudaMemcpyDeviceToHost);

但这个过程太慢了。将数据复制到CUDA大约占所有工作时间的3-5%。从CUDA复制数据大约占所有工作时间的80-85%。

如何减少数据传输时间?

1 个答案:

答案 0 :(得分:0)

这结果是时间问题和内核启动的异步性质而不是慢速数据传输速率。主机传输的定时设备包括执行先前的内核,因为cudaMemcpy调用是一系列内核启动后的第一个阻塞调用。我们没有看到问题中任何实质的代码,但解决方案是改变这种类型的API调用序列:

cudaMemcpy(deviceData, hostData, dataSize * sizeof(MyDataType), cudaMemcpyHostToDevice);

//processing data by launching kernels

cudaMemcpy(hostData, deviceData, dataSize * sizeof(MyDataType), cudaMemcpyDeviceToHost);

到此:

cudaMemcpy(deviceData, hostData, dataSize * sizeof(MyDataType), cudaMemcpyHostToDevice);

//processing data by launching kernels

cudaDeviceSynchronize(); // host code blocks here instead
cudaMemcpy(hostData, deviceData, dataSize * sizeof(MyDataType), cudaMemcpyDeviceToHost);