2016-04-25 42 views
4

Unter http://docs.nvidia.com/cuda/cuda-c-programming-guide/#device-variable-qualifier heißt es, dass eine __device_ Qualifier-Variable die "Lebensdauer einer Anwendung" hat. Bedeutet das den Kernel? Wenn es mehrere Kernel gibt, woher weiß CUDA dann, welche Variable zu welchem ​​Kernel gehört?Bereich von __device__ Qualifier

Wenn ich erkläre eine __device_ Variable wie so:

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

Ist „var“ nach wie vor global in dem Sinne, dass es nach wie vor erreichbar von einem Kern aus einer anderen Funktion gestartet ist, auch wenn es „local“ ist auf dem Stapel von someHOSTfunction() und erhält Bereich (?), wenn einigeHOSTfunction() zurückgibt? Macht es einen Unterschied, es so zu schreiben:

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

Jetzt Var ist eine globale Variable. Aber das bedeutet, dass es auch von anderen Übersetzungseinheiten aus zugänglich ist. Dies wird wahrscheinlich arbeiten, um nicht zu verhindern, dass:

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

Was der richtige Weg, es zu tun wäre?

Antwort

3

Dies:

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

ist illegal in CUDA. Eine __device__ Variablendeklaration ist in einem Funktionskörper nicht zulässig, und der Compiler gibt einen Fehler aus, wenn Sie dies versuchen. Sie müssen sie im Übersetzungseinheitsbereich deklarieren. Die Einschränkung gilt für jede Funktion, sei es oder __device__.

Wenn Sie für verschiedene Kernel unterschiedliche statisch deklarierte __device__ Variablen benötigen, verwenden Sie für jeden einen anderen Variablennamen. Oder verwenden Sie eine Runtime-allokierte Variable und übergeben Sie sie als Argument an Ihren Kernel oder verwenden Sie Template-Parametervariablen oder etwas anderes. Aber was Sie beschreiben, ist in CUDA unmöglich, wie es heute existiert.

+0

Ist dies für die Funktion auf dem Gerät gilt: d. H. __ device__ void fun() {}? Afaik ist es möglich, eine __ shared__ var auf diese Weise zu deklarieren. – Bwawhwmopoloin

+0

Wenn Funktion als '__device__' deklariert wird, ist nur ** der Gerätecode zugänglich (d. H. Aus dem Kernel oder einer anderen' __device__' Funktion). '__shared__' bezieht sich nur auf Variablen und bedeutet, dass sie im Thread Shared Memory gespeichert werden (alle Threads aus einem Block haben Zugriff auf die Variable). Siehe den Link für weitere Informationen: http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#c-language-extensions – Matso

+0

Ich war ein bisschen unspezifisch. Ich meinte, wenn ich eine __device __ Variable in einer __device __ Funktion deklariere, wäre das in Ordnung? – Bwawhwmopoloin