2011-12-24 4 views
1

私は、それぞれが小さな行列乗算を実行している、多数のスレッドを実行するというタスクを持っています。すべての小さな行列はグローバルメモリにロードされています。それぞれのスレッドが小さな行列を共有メモリにロードしてから、製品を計算することでパフォーマンスを向上させたいと考えています。しかし問題は、コンパイル時に行列のサイズがわからないことです。だから、__shared__ double mat1[XSIZE][YSIZE]のように変数を作成することはできません。 PC上では、私は動的割り当てを行っていたでしょう。しかし、共有メモリ上でそれを実行できるかどうかは分かりません。カーネル内でmallocを呼び出すと、グローバルメモリ内にしかメモリが割り当てられない場合(そのような呼び出しが可能であると仮定すると)、どちらも役に立ちません。CUDA共有メモリのカーネルで実行時に配列を作成する方法は?

カーネルでは、実行時に配列を宣言する方法はありますか?この問題を解決する他の方法はありますか?

答えて

5

あなたが動的に宣言することができますが、この

__global__ void kernel() 
{ 
    extern __shared__ double *mat1; 
} 

のようなCUDAでの共有メモリの割り当てを、サイズのそしてこれは、CUDAプログラミングガイドでより詳細に議論され、この

kernel<<<grid,block,XSIZE*YSIZE*sizeof(double)>>>(); 

のようにカーネルを起動します。

+0

この方法では、同じ量のメモリを各スレッドに動的に割り当てることができます。私は異なったサイズのmatits、各スレッドにはまだわからない上下限のサイズを設定しなければなりません。 しかし、ご返信と参考にどうもありがとうございます。それは良い出発点です。はい、B.16のプログラミングガイドで説明しましたが、ヒントから分かりました。 – Elan

+3

いいえ、共有メモリを各ブロック*に動的に割り当てます。共有メモリはCUDAのブロックスコープであり、スレッドスコープではありません。 – talonmies

関連する問題