2016-11-12 24 views
2

I次のコードを持っている:CUDA:メモリ修飾子の不正な組み合わせ

main.cu:

#include "class.h" 
int main() {} 

class.h:

class Class { 
    __global__ 
    void Function() {}; 
}; 

私はコマンドを使用してこのコードをコンパイルnvcc -c main.cu -o main.o、次のエラーが表示されます。

class.h(3): warning: inline qualifier ignored for "global" function 
class.h(3): error: illegal combination of memory qualifiers 

これらのエラーのそれぞれについて質問があります。なぜそれが関数のための修飾子__global__を "無視"するのですか?この文脈で__global__メモリ修飾子が不正なのはなぜですか?私はしかし、私の機能は私の知る限り、静的なメンバーではないdocumentation

その
E.2.10.2. Function Members 
Static member functions cannot be __global__ functions. 

で読みました。 __global__行を削除するとコンパイルでき、__global__void Function();行をmain.cuに移動することもできます。これが実際に許可されていない場合、CUDAはこの制限を強制するのはなぜですか?構造化されたコードを維持しながらこれを回避する方法は何ですか?

明らかに、GPUカーネルを作成できる関数を持つクラスを作成する方法は他にありません。カーネルはmain.cuのグローバル関数からしか作成できないようです。私はCUDAのプログラミングをかなり新しくしているので、私には明らかではないかもしれないいくつかのCUDAの慣習を見逃しているかもしれません。このような場合は、教えてください私は適切なプログラミングの練習に追いつくことができますので。

+4

短い答えはいいえ、できません。あなたはGoogleの "cudaグローバルクラスのメンバー" youllは[ここ]のようなので、これを含む治療法の番号を見つける(http://stackoverflow.com/questions/17535959/member-function-of-ac-object-as- a-cuda-global-function)と[here](http://stackoverflow.com/questions/13748231/cuda-kernel-as-member-function-of-a-class)を参照してください。質問は間違いなく、 。簡単な提案として、あなたのcudaカーネルをホスト呼び出し可能クラスメンバ関数でラップして、 "適切なプログラミングの実践についていく"ことができます。 –

+0

こんにちは@ロバーツ、ご意見ありがとうございます。私はちょうど私があなたの提案を理解することを確認したい。私のクラスで '__host__'関数を作成することをお勧めします。その関数の実装は' __global__'関数を呼び出しますか?もしそうなら、 '__global__'関数のスコープはどれですか? –

+1

はい、最初の質問に。 2番目の質問がわかりません。クラスメンバ関数の実装がどんなスコープの中にあるべきか明確に分かりませんか? –

答えて

1

CUDAカーネルをOOP形式で使用したいと考えています。これがそうであった場合は、以下のクラス構造は、動作するはずです:

// myclass.h 
class MyClass { 
    public: 
     void call_kernel(...); 
}; 

// myclass.cu 
__global__ 
void my_kernel(...) { 
    // do some work 
} 

void MyClass::call_kernel() { 
    // prepare data for the kernel, e.g. allocating memory, copying from host to device, etc. 

    // run kernel 
    my_kernel <<<...>>>(...); 

    // copy results from device to host, clean up, etc. 
} 

カーネルコードを含む複数のクラスを持っている場合、そのソースコードファイルはすべて.cu拡張子を使用する必要があり、そしてあなたがseparate compilationを有効にする必要がありますのでご注意ください。

関連する問題