2012-09-17 23 views
5

我对固定内存有疑问。如何使矢量类型值固定在cuda中的内存

现在我正在使用CUDA来处理大量的数据。

为了减少运行时间,我发现有必要使内存复制和内核启动重叠。

搜索一些文本和网页后,重叠内存复制和内核启动,我注意到有必要通过使用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] >>> (...); 
} 

但在我而言,我的主人离去内存由vertor类型设置。

而我无法找到任何方式通过使用cudaMallocHost将矢量类型主机内存转换为固定内存。

帮我解答一下这个问题或者给点建议。 感谢您阅读我可怜的英语。谢谢。

+1

“矢量类型”是什么意思?你的意思是C++'std :: vector',还是别的? – talonmies

+0

是的。我的意思是std :: vector。 – Umbrella

回答

4

直接地,您不能使用cudaMallocHost为任何其他POD类型分配内存。

如果你真的需要一个std::vector它使用固定的内存,您将不得不实现自己的std::allocator模型这就要求cudaMallocHost内部和使用自定义分配器实例化std::vector

另外,在thrust template library(其船只在最近CUDA工具包的版本),包括你可以与自己的推力矢量类,这是iteself的std::vector模型中使用的实验固定内存分配器。

+0

谢谢talonmies。这个内容对我的情况有帮助。 – Umbrella

+0

我还有一个小问题。使用cudaMemcpyAsync和没有cudaMallocHost的内核可以吗?我试图使主机固定内存的异步代码,但这工作良好。它是一般的还是意外的? – Umbrella

+1

是的,它可以工作,但是对于任何> 64kb的传输,设备上的传输不会是异步的。主机API调用立即返回,但设备被阻止直到复制完成,即。没有同时的内核执行和内存拷贝或'cudaMemcpyAsync'的任何其他好处。 – talonmies