2017-02-19 36 views
0

ポインタを渡して配列を指すと、follエラーが発生します。 引数float型のfloat の引数は互換性がありません型のパラメータを持つ「フロート()[32768]CUDA:float *型の引数がfloat型のパラメータと互換性がありません[32768]

私のコードの関連するスニペットは、次のとおりです。?

#define N 32768 

__global__ void op(float k_a[][N]) 
{ 
//some operation 
} 
float *ptr_a=(float*)malloc(N*N*sizeof(float)); 

float *d_ptr_a;cudaMalloc((void**)&d_ptr_a,N*N*sizeof(float)); 

cudaMemcpy(d_ptr_a,ptr_a,N*N*sizeof(float),cudaMemcpyHostToDevice); 

op<<<nblocks,nthreadsperblock>>>(d_ptr_a) 

いくつかは、私はCUDAに初心者です間違っていただきました!教えてもらえます

+0

エラーメッセージは非常に明示的です。引数として渡すタイプは、カーネルが要求するタイプと同じではありません。 – talonmies

+2

私はこれをCUDAとは関係がないと言います。通常の 'void op(float k_a [] [N])'を定義し、それに 'float *'引数を渡すだけで、同じ(または類似の)エラーメッセージが出ます。 Clangは引数 '1'を 'void op(float(*)[32768])'に 'エラー:' float * 'を' float(*)[32768] 'に変換できません' – CygnusX1

+0

そして、なぜ 'k_a'これは "奇妙な"ことでしょうか? 「浮動*してもうまくいかない? – Matso

答えて

3

何。私たちはここにポインタと配列の不正な使用。ルーチンopの定義によれば、floatの長さNの配列へのポインタは、のポインタを必要とします。一方、と入力してfloatと入力すると、引数として渡されます。その結果、互換性のない型のエラーメッセージが表示されます。

floatの2D配列で処理するルーチンは、floatへのポインタであることをお勧めします。このような場合には、インデックスyでアクセス元の2DアレイのM「行」の全ては、そのような、単一のラインに、メモリ内に次々に座る:

[row0][row1][row2]...[rowM-1] 

をすべてのそのような行が含まれていますN "カラム"、インデックスxによってアクセスされます。そのような単純な

index = y * N + x; 

:いくつかのペア(x, y)の値を取得するには、我々は1次元配列にアクセスするグローバルインデックスを作成する必要があります。

+1

"*長さN ***の配列の配列が必要です。これは長さNの配列への*ポインタ*を必要とします。これはあなたが言及しているように、おそらく同じ型の他の配列が続くことが予想されます。つまり、 "*長さN *の配列の配列これは概念的な問題を明らかにします。すなわち、問題の関数(ここで 'op()')*は第2次元*を知っていません**! – alk

+0

@alk良い点 - 私は答えを修正します。 – Matso

関連する問題