2011-11-11 7 views
2

エラーコード:試験にcudaMalloc、私は次のようにCUDAにおける2Dアレイを実装するためにattempingだ11

u_int32_t **device_fb = 0; 
u_int32_t **host_fb = 0; 

cudaMalloc((void **)&device_fb, (block_size*grid_size)*sizeof(u_int32_t*)); 

for(int i=0; i<(block_size*grid_size); i++) 
{ 
    cudaMalloc((void **)&host_fb[i], numOpsPerCore*sizeof(u_int32_t)); 
} 
cudaMemcpy(device_fb, host_fb, (block_size*grid_size)*sizeof(u_int32_t*), cudaMemcpyHostToDevice); 

host_fbはNULLです。さらに、cudaMalloc((void **)&host_fb[i], numOpsPerCore*sizeof(u_int32_t));の最初の反復のエラーコードを取得すると、cudaErrorInvalidValueが得られます。私は間違って何をしていますか?ありがとう!

答えて

2

あなたのコードにはいくつか問題があります。下のコードのコメントを見てください。

配列のサイズでは、ポインタ型ではなくsizeof(u_int32_t)を使用する必要があります。 いくつかのプラットフォームでは2つのタイプのサイズが誤って同じになる可能性があるため、他のプラットフォームでは誤ってエラーが検出されることはありません。

size_t arr_size = (block_size*grid_size) * sizeof(u_int32_t); 

// host array wasn't allocated at all. 
host_fb = malloc(arr_size); 
cudaMalloc((void **)&device_fb, arr_size); 

// the loop is unnecessary, you have now an allocated 2D table  

cudaMemcpy(device_fb, host_fb, (block_size*grid_size)*sizeof(u_int32_t*), cudaMemcpyHostToDevice); 

cudaMallocHostcudaHostAllocの両方は、あなたがここに欲しいものはおそらくないデバイスへのアクセスのページ・ロックホストメモリを割り当てるので、私は、malloc機能を使用していました。パフォーマンス上の問題がある場合は、割り当てられたメモリを強制的にページングするため、両方とも使用することができます。詳細についてはそれぞれのドキュメントを参照してください。

+0

あなたのコードを試しましたが、 'host_fb'にループが必要だと思っています。そうでなければ' host_fb [0] 'にアクセスしようとするとバスエラーが発生します。私は(あなたの変更のいくつかと一緒に)ループを戻しました、そしてうまくいったようですが、それが正しいかどうかは分かりません。 – Pygmalion

+0

バスエラーの意味は?あなたはいつそれを手に入れますか? cudaErrorInvalidValue(エラーコード11)でしたか? –

+0

以前はエラーがcudaMalloc(エラーコード11)にありました。今、私がcuda-gdbで実行しようとすると、バスエラーが発生し、 'host_fb [0] [0]'のメモリにアクセスできないと言います。 – Pygmalion

0

GPUの2D配列は扱いにくいので、GPUとCPUのアドレス空間が互換性がないことを考慮する必要があります。

1)** host_fb配列を最初に初期化しないため、for-cycleでこの配列の要素を後で呼び出すとエラーが発生します。

2)あなたは、コードが想定しているものを私たちに語っていないとして、私は、あなたを助けることができないそれ以外はCPU

によってアクセスされるメモリを割り当てるためにcudaMallocHost(または類似したもの)を使用する必要があります達成するために。

関連する問題