次のコードがセグメンテーション違反を引き起こす理由を理解できる人はいますか? 同様に、「悪い」というラベルの付いた 2 行を「良い」というラベルの付いた 2 行と交換しても、セグメンテーション違反が発生しない理由を理解できる人はいますか?
seg fault は cudaMalloc 行で発生しているように見えることに注意してください。それをコメントアウトすると、セグメンテーション違反も表示されません。これらの割り当ては互いに踏み合っているようですが、その方法がわかりません。
コードの目的は、3 つの構造体をセットアップすることです。ホスト上の h_P は、デバイス上の CPU ルーチン d_P によって取り込まれます。これは、ホスト上の GPU ルーチン h_P_copy によって取り込まれます。 GPU データ構造を元に戻します。
そうすれば、正しい動作を検証し、一方と他方のベンチマークを行うことができます。
実際、これらはすべて 4 次元配列です。
(問題があれば、問題のカードは SUSE Linux で nvcc 4.2 を使用する GTX 580 です)
#define NUM_STATES 32
#define NUM_MEMORY 16
int main( int argc, char** argv) {
// allocate and create P matrix
int P_size = sizeof(float) * NUM_STATES * NUM_STATES * NUM_MEMORY * NUM_MEMORY;
// float *h_P = (float*) malloc (P_size); **good**
// float *h_P_copy = (float*) malloc (P_size); **good**
float h_P[P_size]; // **bad**
float h_P_copy[P_size]; // **bad**
float *d_P;
cudaMalloc( (void**) &d_P, P_size);
cudaMemset( d_P, 0.0, P_size);
}