CUDAプログラミングが初めてです。現在、データを並列処理するためにCUDAを使用するOOフレームワークを構築しようとしています。私は現在CUDA 8.0を使用しています。クラス内のcuda __constant__メモリを宣言する
すべてのスレッドが頻繁にアクセスする必要があるキーパラメータがいくつかあります。これらを定数メモリに入れると、メモリの読み込みプロセスが改善されると思います。クラスヘッダで宣言し、後でcudaMemcpyToSymbol
を使って初期化したいと思います。
他の例(これはオブジェクト指向ではありません)から、定数メモリシンボルはグローバル変数であるかのように定義し、cudaMemcpyToSymbol
を使って初期化することができます。私はどちらかのクラス定義内__constant__
どこかを指定することはできません
error : attribute "__constant__" does not apply here
:私はクラスのヘッダ内の一定のメモリシンボルを定義する場合は、コンパイラがで文句を言います。それはオブジェクト指向のフレームワークのコンテキストで定数メモリを定義することができないようですね?回避策があればお手伝いください。どうもありがとうございました!
myClass.cuh
class myClass
{
private:
__constant__ int foo[3];
void initialize();
void compute(); // required repeated and heavy access of foo from every thread
}
myClass.cu
void myClass::initialize()
{
int bar[3] ={1,2,3};
//attempt to copy the data in bar to foo
cudaMemcpyToSymbol(foo, bar, 3*sizeof(int), 0, cudaMemcpyHostToDevice);
}
ありがとうございました!最後の段落を参照して、私のカーネルを '__global__ void compute(int foo [3]);'として宣言できるだけであることを意味しますか?値で変数 'foo'を渡すだけです(ポインタではなく)。 –
はい、それは動作する方法です。そこバイト単位の引数リスト(2キロバイトのIIRC)の最大サイズには限界があるが、あなたはそれと一緒に暮らすことができるかどうかの引数が自動的にあなたが一定のメモリアクセスをキャッシュされますよう、値渡し。 – talonmies