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