[英]Kernel parameter passing in CUDA?
關於CUDA內核如何工作,我有一個新手懷疑。
如果有以下代碼(使用從此處獲取的函數cuPrintf
):
#include "cuPrintf.cu"
__global__ void testKernel(int param){
cuPrintf("Param value: %d\n", param);
}
int main(void){
// initialize cuPrintf
cudaPrintfInit();
int a = 456;
testKernel<<<4,1>>>(a);
// display the device's greeting
cudaPrintfDisplay();
// clean up after cuPrintf
cudaPrintfEnd();
}
執行的輸出是:
Param value: 456
Param value: 456
Param value: 456
Param value: 456
我無法得到內核如何讀取我傳遞的參數的正確值,是不是在主機內存中分配了? GPU可以從主機內存中讀取嗎?
謝謝,
安德里亞
根據E.2.5.2節。 “ CUDA C編程指南”中的函數參數
__global__函數參數傳遞給設備:
聲明void testKernel(int param)
表示param
是通過值傳遞的,而不是通過引用傳遞的。 換句話說,該堆棧包含的拷貝a
的值,而不是一個指向a
。 CUDA將堆棧復制到GPU上運行的內核。
根據CUDA編程指南(附錄B.16),參數通過共享內存傳遞給設備。
在實際函數參數之前評估執行配置的參數,並且像函數參數一樣 ,當前通過共享內存傳遞給設備。
在運行時API中, 全局函數的參數被隱式編組並從主機復制到設備。
NVCC編譯器生成隱藏編組的代碼。 您可以在CUDA編程指南中找到參數大小和限制
調用它們時,參數將傳遞給內核; 否則你怎么會與GPU溝通? 它與在着色器中設置制服背后的想法相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.