2013-12-12 31 views
2

我有一個C++項目,在C++中使用CUDA與DLL。如何以正確的方式在C++中使用CUDA在C++項目和DLL之間傳輸數據?

現在我從主項目傳遞2個指針到DLL。在DLL內部,陣列將被複制到設備內存。一些計算將與他們一起完成。然後,陣列將被複制回主機。

我聽說用數據重疊的方法數據傳輸會更好。但在這種情況下我怎麼能做到這一點?複製功能cudaMemcpyAsync要求固定內存是異步的,並且傳遞的指針不是正確的?

我使用的臨時解決方案是使用memcpy將傳遞的數組複製到固定數組。然後,我使用流來重疊數據。之後,再次使用memcpy從固定內存數組複製到傳遞數組。我想,CPU的東西顯然不是一個好方法。

我們可以做些什麼,比如當兩個CUDA都將固定內存數組從主項目傳遞到DLL時?

非常感謝提前。

+3

您可以使用['cudaHostRegister'](http://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__MEMORY.html#group__CUDART__MEMORY_1g36b9fe28f547f28d23742e8c7cd18141)將簡單主機內存轉換爲固定內存。 – sgarizvi

+0

這似乎是一個,我會檢查。謝啦。 – Harry

+4

@ sgar91請發表你的建議,使用'cudaHostRegister()'作爲答案。這樣哈利可以接受它,人們會知道這個問題已經得到解答。 – Tom

回答

2

通過標準的C/C++分配器即分配的內存mallocnew可以通過使用運行時CUDA功能cudaHostRegister,其可用於異步重疊內存拷貝的B/W主機和設備被轉換到鎖定的頁存儲器。被告知;不要忘記取消固定使用上述功能固定的內存。使用cudaHostUnregister解鎖內存。如果內存不固定,可能會產生不希望的結果。例如一個函數可能試圖固定已經固定的內存。或固定內存可能使用freedelete這是未定義的行爲。

相關問題