我对制作固定内存有疑问。
现在我正在使用CUDA处理大量数据。
为减少运行时间,我发现有必要使内存复制和内核启动重叠。
在搜索了一些文本和网页后,重叠内存复制和内核启动时,我注意到有必要使用cudaMallocHost分配主机内存,cudaMallocHost会将主机内存分配给固定内存。
在主机上使用整数或数组类型的情况下,很容易制作固定内存。
就像这样...
cudaStream_t* streams = (cudaStream_t*)malloc(MAX_num_stream * sizeof(cudaStream_t));
for(i=0; i<MAX_num_stream; i++)
cudaStreamCreate(&(streams[i]));
cudaMallocHost(&departure, its_size);
for(n=1; ... ; n++){
cudaMemcpyAsync( ... streams[n]);
kernel <<< ... , ... , ... , streams[n] >>> (...);
}
但在我的情况下,我的主机离场记忆是由垂直类型设置的。
我无法通过使用cudaMallocHost找到将矢量类型主机内存转换为固定内存的方法。
帮助我或提供一些建议来解决这个问题。 谢谢你阅读我可怜的英语。感谢。
答案 0 :(得分:5)
直接地,您无法使用cudaMallocHost
为任何其他POD类型分配内存。
如果确实需要使用固定内存的std::vector
,则必须实现自己的std::allocator
模型,该模型在内部调用cudaMallocHost
并实例化std::vector
使用该自定义分配器。
或者,thrust template library(最近发布的CUDA工具包中包含)包含一个实验固定内存分配器,您可以使用推力自己的矢量类,它本身就是std::vector
的模型。 / p>