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の慣習を見逃しているかもしれません。このような場合は、教えてください私は適切なプログラミングの練習に追いつくことができますので。
短い答えはいいえ、できません。あなたは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カーネルをホスト呼び出し可能クラスメンバ関数でラップして、 "適切なプログラミングの実践についていく"ことができます。 –
こんにちは@ロバーツ、ご意見ありがとうございます。私はちょうど私があなたの提案を理解することを確認したい。私のクラスで '__host__'関数を作成することをお勧めします。その関数の実装は' __global__'関数を呼び出しますか?もしそうなら、 '__global__'関数のスコープはどれですか? –
はい、最初の質問に。 2番目の質問がわかりません。クラスメンバ関数の実装がどんなスコープの中にあるべきか明確に分かりませんか? –