2011-11-28 114 views
8

爲特定線程配置調用CUDA內核時, 上存在哪些內存空間(設備/主機)內核參數應該存在的嚴格規則以及它們應該是什麼類型?CUDA內核的參數

假設我啓動的線程的與

kernel<<<numblocks, threadsperblock >>> (/*parameters*/) 

1-d網格我可以傳遞一個整數參數int foo其爲主機 -integer變量, 直接向CUDA內核?或者我應該將cudaMalloc內存的單個整數表示爲dev_foo,然後cudaMemcpyfoo分成devfoo,然後通過devfoo作爲內核參數?

回答

12

內核參數的規則是C++參數傳遞規則以及設備和主機內存在物理上分離的事實的邏輯結果。

CUDA不允許通過引用傳遞參數,您必須小心指針。

具體而言,您必須按值傳遞參數。傳遞用戶定義的類型要求默認的複製構造函數或自己的複製構造函數(如果存在)不包含任何內存分配(堆分配「new」或「malloc」)。

總結傳值函數適用於整型,浮點或其他基本類型,以及簡單的平面用戶定義的結構或類對象。

5

對於數據塊,您只需要使用cudaMalloc()cudaMemcpy()。不是單一的int s等等。您還可以通過struct s作爲參數,只要它們沒有指向主機內存中的數據塊的成員即可。作爲一個經驗法則:如果你傳遞一個指向內核的指針,確保它指向設備內存。