2016-04-25 27 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... 
} 

が、それは「ローカル」であるにも関わらず、まだ別の関数から起動カーネルからアクセス可能であることをまだグローバル意味で「VAR」ですsomeHOSTfunction()のスタック上にあり、いくつかのHOSTfunction()が返ってくるとスコープ(?)になりますか?

__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__となります。

異なる静的に宣言された変数が異なるカーネルに必要な場合は、それぞれに異なる変数名を使用します。あるいは、ランタイムに割り当てられた変数を使用して、それをカーネルの引数として渡すか、テンプレートパラメータ変数などを使用します。しかし、あなたが言うことは、今日存在するCUDAでは不可能です。

+0

これは、関数がデバイス上にあることに該当します。つまり、__ device__ void fun(){}? Af @ ck __ shared__ varをそのように宣言することは可能です – Bwawhwmopoloin

+0

関数が '__device__'として宣言されていれば、それは**単に**デバイスコードを(**カーネル内または他の' __device__'関数から)**アクセス可能になります。 '__shared__'は変数のみを参照し、スレッド共有メモリに格納されることを意味します(1つのブロックのすべてのスレッドは変数へのアクセス権を持ちます)。詳細はリンクを参照してください:http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#c-language-extensions – Matso

+0

私は少し不明でした。私は、__device __関数で__device __変数を宣言すると、それは大丈夫でしょうか? – Bwawhwmopoloin