2016-04-25 55 views
4

http://docs.nvidia.com/cuda/cuda-c-programming-guide/#device-variable-qualifier它表示__device_限定符變量具有「應用程序的生命週期」。這是否意味着內核?如果有幾個內核,CUDA如何知道哪個變量屬於哪個內核?__device__限定符的範圍

如果我聲明__device_變量,像這樣:

void someHOSTfunction() { 
    __device__ int var; 
    // Launch kernel etc... 
} 

是「無功」還是在這個意義上全球,它仍然是從不同的功能推出了內核訪問,即使它是「本地」在someHOSTfunction()的堆棧上並在someHOSTfunction()返回時獲取作用域(?)?它是否有任何區別如下所示:

__device__ int var; 
void someHOSTfunction() { 
    // Launch kernel etc... 
} 

現在var是一個全局變量。但這意味着它也可以從其他翻譯單位訪問。這可能不會阻止:

static __device__ int var; 
void someHOSTfunction() { 
    // Launch kernel etc... 
} 

這樣做的適當方式是什麼?

回答

3

此:

void someHOSTfunction() { 
    __device__ int var; 
    // Launch kernel etc... 
} 

是CUDA非法的。 A __device__函數體內不允許使用變量聲明,如果您嘗試這樣做,編譯器將發出錯誤。您必須在翻譯單位範圍內聲明它們。該限制適用於任何功能,無論是__host__還是__device__

如果您需要針對不同內核的不同靜態聲明__device__變量,請爲每個內核使用不同的變量名稱。或者使用運行時分配的變量,並將其作爲參數傳遞給內核,或使用模板參數變量或其他。但是你所描述的在CUDA中是不可能的,因爲它現在已經存在。

+0

這是真實的功能是在設備上:即__ device__ void fun(){}? Afaik可以這種方式聲明__ shared__ var – Bwawhwmopoloin

+0

如果函數被聲明爲'__device__',它將只能從設備代碼(即從內核或任何其他'__device__'函數中)訪問**。 '__shared__'只引用變量,意味着它們將存儲在線程共享內存中(一個塊中的所有線程都可以訪問該變量)。請參閱以下鏈接瞭解更多信息:http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#c-language-extensions – Matso

+0

我有點不確定。我的意思是,如果我在__device __函數中聲明__device __變量,那會好嗎? – Bwawhwmopoloin