2017-03-27 14 views
1

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); 
} 

答えて

3

構造またはクラス内のメモリ指定子(__constant____shared____global__)を許可しないCUDAオブジェクトモデル。これは、慎重かつ賢明な設計選択です。つまり、準拠しているオブジェクトを任意のメモリ空間内でインスタンス化することができ、準拠したオブジェクトをメモリ空間間でコピーすることができます。

あなたはあなたが説明したことを行うことはできません。あなたが一定のメモリに保存されている小型の配列をしたい場合は、静的に、あなたがそれにアクセスする必要があるのコンパイル単位でそれをコンパイルする必要があります。または、配列がリンケージ内たらを宣言して、別々のコンパイルとリンクを使用する必要があります。スコープをより詳細に制御したい場合は、名前空間を使用します。それはできるだけ多くです。一方、最終的な意図は値によってCUDAカーネルにこの構造体を通過させることである場合

、その後は一定のメモリを心配する必要はありません。これは、現在サポートされているアーキテクチャの専用定数メモリに渡されたすべてのカーネル引数があり、何もせずに必要な効果を得るためです。

+0

ありがとうございました!最後の段落を参照して、私のカーネルを '__global__ void compute(int foo [3]);'として宣言できるだけであることを意味しますか?値で変数 'foo'を渡すだけです(ポインタではなく)。 –

+0

はい、それは動作する方法です。そこバイト単位の引数リスト(2キロバイトのIIRC)の最大サイズには限界があるが、あなたはそれと一緒に暮らすことができるかどうかの引数が自動的にあなたが一定のメモリアクセスをキャッシュされますよう、値渡し。 – talonmies

関連する問題