cudaMemcpy セグメンテーション フォールト
デバイスからホストにデータを転送するために cudaMemcpy を呼び出すと、ユーザーはセグメンテーション フォールトに遭遇する可能性があります。これは多くの場合、デバイス ポインタの不適切な処理に起因します。
問題
次のコードは、この問題を示しています。
cudaMemcpy(CurrentGrid->cdata[i], Grid_dev->cdata[i], size*sizeof(float),\ cudaMemcpyDeviceToHost);
ここで、Grid_dev はグリッド クラス オブジェクトへのデバイス ポインター。 cudaMemcpy 呼び出しでこのポインタを直接逆参照しようとすると、セグメンテーション違反が発生する可能性があります。
解決策
この問題を解決するには、ホスト上に中間ポインタを作成する必要があります。デバイスポインタを参照します。次のコードは、修正されたソリューションの概要を示しています。
float * A; cudaMalloc((void**)&A, sizeof(float)); ... ... cudaMemcpy(&A, &(Grid_dev->cdata[i]), sizeof(float *), cudaMemcpyDeviceToHost); CurrentGrid->cdata[i] = new float[size]; cudaMemcpy(CurrentGrid->cdata[i], A, size*sizeof(float), cudaMemcpyDeviceToHost);
この修正されたコードでは、A は最初にデバイス ポインタを指すホスト ポインタです。 cudaMemcpy を使用して Grid_dev->cdata[i] の値を A にコピーすることで、デバイス ポインタをホストに効果的に転送します。その後、CurrentGrid->cdata[i] をホスト上の新しい float 配列に割り当てることができ、データをデバイス ポインター A からこの配列にコピーできます。
以上がデバイスからホストにコピーするときに「cudaMemcpy」によってセグメンテーション違反が発生するのはなぜですか?それを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。