0

複数のOpenMPスレッドから複数のCUDAデバイスを使用しようとしています。デバイスはメインスレッドから初期化され(つまり、メモリが割り当てられ)、次にcudaSetDevice別のスレッドから使​​用して、別のデバイスでカーネルを起動します。スレッドはデバイスを共有していません。各スレッドはそのデバイスに排他的にアクセスできます。

私が理解していることから、これはうまくいくはずです。ただし、メインではないOpenMPスレッド(つまり、omp_get_thread_num()!= 0)からデバイスでカーネルを起動するとすぐに、CUDAから「無効なデバイスの序数エラー」が発生します。

kernel<<<...>>>(...);
error = cudaDeviceSynchronize(); // returns cudaSuccess
error = cudaGetLastError(); // returns invalid device ordinal error

私は何かが足りないのですか?誰かが以前にこのようなものを見たことがありますか?CUDA5.0を使用しています。

4

1 に答える 1

0

この問題を解決するために、この問題は、cudaGetLastErrorを使用してカーネルの起動後にエラーをチェックしようとしたが、前の1回の呼び出しのエラー戻り値をチェックしなかった結果でした。したがって、カーネルの起動後にcudaGetDeviceInfoを呼び出したときにエラーコードが返されていましたが、これは起動自体からのものであると誤って推測していました。このエラーが表示された場合は、CUDAAPIへの以前のすべての呼び出しによって返されたエラー値を確認していることを確認することをお勧めします。

于 2012-11-09T17:40:25.540 に答える