c++ - 如何提高内存使用性能?

标签 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%。

如何减少数据传输时间?

最佳答案

事实证明这是时间问题和内核启动的异步性质,而不是数据传输速率慢。定时设备到主机的传输包括先前内核的执行,因为 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);

关于c++ - 如何提高内存使用性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33095907/

相关文章:

c++ - map 、集合等的 array_view 替代方案

c++ - 你怎么称呼这个 : "unsigned int a_bit : 1;"? 是否有位域之外的用途?

c++ - 在包含对 cuda 内核的引用的库中链接

c++ - 修复 GCC 的 #includes <> (Code::Blocks)

c++ - 由单个元素组成的参数包的折叠表达式在什么基础上转换为未加括号的表达式

python-3.x - 如何检查cuda是否在Anaconda上正确安装

cuda - CUDA的虚拟和实际架构之间的差异

c++ - 为什么成员变量不能共享?

c++ - 与 libCGAL-vc120-mt-sgd-4.5.1.lib 的链接错误,似乎无法找到或构建它

c++ - 创建静态 CUDA 库以与 C++ 程序链接