簡體   English   中英

在CUDA中傳遞內核參數?

[英]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__函數參數傳遞給設備:

  • 通過共享內存,在計算能力1.x的設備上限制為256字節,
  • 通過恆定內存,在計算能力2.x及更高的設備上限制為4 KB。

聲明void testKernel(int param)表示param是通過值傳遞的,而不是通過引用傳遞的。 換句話說,該堆棧包含的拷貝a的值,而不是一個指向a CUDA將堆棧復制到GPU上運行的內核。

根據CUDA編程指南(附錄B.16),參數通過共享內存傳遞給設備。

在實際函數參數之前評估執行配置的參數,並且像函數參數一樣 ,當前通過共享內存傳遞給設備。

在運行時API中, 全局函數的參數被隱式編組並從主機復制到設備。

NVCC編譯器生成隱藏編組的代碼。 您可以在CUDA編程指南中找到參數大小和限制

調用它們時,參數將傳遞給內核; 否則你怎么會與GPU溝通? 它與在着色器中設置制服背后的想法相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM