1

次のコードに問題があります。cublasSrotgの呼び出しを実行すると、例外がスローされます。「dA」ポインタのアドレスである「アクセス違反の書き込み場所0x05200600」。デバッガーを実行すると、cudaMallocの呼び出しをスキップしているように見えますが、何が間違っているのか理解できません。

cublasHandle_t handle;
cublasCreate(&handle);
float hA[SIZE] = { 1.0f, 2.0f, 3.0f, 4.0f };
int sizef = sizeof(float);
float* dA;
cudaMalloc((void**)&dA, SIZE * sizef);
cublasSetVector(SIZE, sizef, hA, 1, dA, 1);
float s, c;
cublasSrotg(handle, dA, dA + N, &c, &s);
cublasSrot(handle, N, dA, 1, dA + N, 1, &c, &s);
cublasGetVector(SIZE, sizef, dA, 1, hA, 1);
...
4

1 に答える 1

1

SIZE次のコード行から、に等しいものを収集し4ます。

float hA[SIZE] = { 1.0f, 2.0f, 3.0f, 4.0f };

しかし、ここでは、2つの奇妙なことをします。

cublasSrotg(handle, dA, dA + N, &c, &s);
  1. ホストとデバイスのパラメーターを同じcublas関数に混在させます(これが合法かどうかはわかりません)。dAはデバイスポインタでありscはホスト変数です。

  2. 合格dAdA + Nます。N未満でない限り4、範囲外のインデックスを作成するため、問題が発生する可能性があります。また、cublasSrotgへの最初の2つの入力は入力/出力変数であることに注意してください。それらの初期値が使用されますが、その後上書きされます。

それらは上書きされるので、同じポインタをcublasSrot...に渡すのは奇妙です。

詳細については、CUBLASのドキュメントを参照してください。

編集:

cOPは、問題がデバイスとホストポインターの混合であり、デバイスに値を割り当てるためにcudaMallocを呼び出さなかったことをs示しています。

于 2012-06-26T22:28:17.940 に答える