2016-11-22 80 views
0

3x3行列と360x360行列の間の行列乗算をしようとしています。小さな行列(3x3)は、大きな行列の最初の(3x3)ブロックなどで操作されます。したがって、私は小さな行列を定数にして、それをより大きな行列にスライドさせたいと思います。cuda:共有とグローバルを使用した行列乗算

私の小さなマトリックスを共有メモリの一部として保存し、私の大きなマトリックスを3x3に分けてグローバルにすることはできますか?

小さな行列をホストから直接共有する方法を見つけることができません。クンダの視覚化が間違っていれば、どうか私を修正してください。

ありがとうございました。

+2

あなたがすることはできませんホストから共有メモリにコピーします。これはサポートされていません。 – talonmies

答えて

1

ホストから共有メモリを取り込むことはできません。

しかし、例の3x3行列など、すべてのスレッドの定数を処理する最良の方法は、それらを定数メモリ(サイズは64kB)にすることです。定数メモリを使用するには、2つの方法があります。

  • 最も簡単な方法は、カーネル引数を使用することです。 3×3行列を含むカーネル引数を含むstructを定義し、あなたのカーネルに渡し
  • 使用__constant__型修飾子とホストからそれを埋めるためにcudaMemcpyToSymbolを使用します。

    //In global scope 
    __constant__ float mat_gpu[3][3]; 
    //In the function that you use to populate the data 
    cudaMemcpyToSymbol(mat_gpu, mat_cpu, 9 * sizeof(float)); 
    //In your kernel you just use the mat_gpu variable 
    
+0

あなたのすばらしい答えをありがとう。この__constant__型修飾子とcudaMemcpyToSymbolの使用例を提供できますか?本当に大きな助けになるでしょう。前もって感謝します。 –

+1

私はcudaMemcpyToSymbolの使用例を追加しました。 – ptrendx