2012-09-17 28 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