2017-04-20 5 views
0

静的に割り当てられたマトリックスで定数メモリを使用したいと思います。スタティックマトリックスがcudaMemCpyToSymbolに渡されました

float h_M[MASK_WIDTH][MASK_WIDTH] = { 
    { 1, 2, 3, 2, 1 }, 
    { 2, 3, 4, 3, 2 }, 
    { 3, 4, 5, 4, 3 }, 
    { 2, 3, 4, 3, 2 }, 
    { 1, 2, 3, 2, 1 } 
}; 

そして、私は次の関数にh_M行列を渡す必要があります:次のようにmain()機能で

#define MASK_WIDTH 5 
#define MAX_MASK_WIDTH 10 
__constant__ float M[MAX_MASK_WIDTH][MAX_MASK_WIDTH]; 

は、静的に割り当てられた行列を持っている:私は次のように定数行列を宣言

cudaMemcpyToSymbol(M, h_M, sizeof(h_M)); 

これは、で定義されています。cudaMemCpyToSymbol

どうすれば正しく行うことができますか?行列を特定の値で初期化する必要があることを考慮して、それを宣言して動的に割り当てることはできないと思います。 cudaMemCopytosymbolは、コピー後にすべての値がMの0の場合、影響がありません。

あなたは完全なソースコードが必要な場合、それは次のリンクである:このようにcached_convolution_2D_basic

+1

あなたのリンクは死んでいます。また、コードの[最小で完全で検証可能な例](https://stackoverflow.com/help/mcve)を投稿してください。今のように、あなたの結果があなたが期待しているものから外れている理由を理由づけるのは難しいでしょう。 –

+0

ソースコードを追加しました。ホストコードで作成した定数メモリを宣言して初期化しても問題なく動作します。問題はh_M行列を渡すと失敗するcudaMemCpyにあります。 – sgira

+0

'cudaMemcpyToSymbol'へのリンクが動作しません – Toby

答えて

2

あなたが壊れているものを
cudaMemcpyToSymbol(M, h_M, MASK_WIDTH*MASK_WIDTH*sizeof(float)); 

cudaMemcpyToSymbol(M, h_M, sizeof(sizeMask_Width)); 

sizeof(sizeMask_Width)を求めていますコンパイラ "sizeMask_Widthと呼ばれる変数のサイズは何ですか?それはint変数ですので、答えはです。その呼び出しは4バイトしか転送しません。 sizeMask_Widthあなたが転送する必要があるバイトの実際の正しい数であるMASK_WIDTH*MASK_WIDTH*sizeof(float)と同じであるため、

cudaMemcpyToSymbol(M, h_M, sizeMask_Width); 

:あなたはこれを行っている必要があります。

あなたのケースではsizeof(h_M)も同様に働いていたと思いますが、将来の読者のためには、h_Mの特定の定義に依存しています。それは他のわずかに異なる場合にはうまくいかないかもしれません。

+0

申し訳ありません、それは切り取りと貼り付けのエラーの原因だけでした...私は私の問題を解決し、すぐに回答を投稿します! – sgira

0

問題[解決] 問題は、私が代わりに生の主要なレイアウトの行列レイアウトとして考えたということでした。 下の画像を見る enter image description here

Mアレイサイズを有する:MASK_WIDTH * MASK_WIDTH:MAX_MASK_WIDTH * MAX_MASK_WIDTHは、代わりh_Mアレイサイズを有します。ですから、私はcudaMemCpyToSymbol関数を呼び出すと、h_M行列を生の主要なレイアウト順でM行列にコピーします。 一つは、さまざまな方法で問題を解決することができる:

  1. それが最初にあったように、異なる寸法を有する一次元 ベクトルとして(この場合)Mとh_M両方matriciesを宣言する同じ寸法
  2. の行列を宣言したが、カーネルコードに M[i * MASK_WIDTH + j]を使用してください。
関連する問題