次のグローバルカーネルがあります。
__global__ void pdegpu(PDE_ParabolicD1_Num_GPU **pdes)
{
PDE_ParabolicD1_Num_GPU *loc;
loc = new PDE_ParabolicD1_Num_GPU();
loc->Setup();
delete loc;
//above code was just an example to show that new and delete work fine
*pdes = new PDE_ParabolicD1_Num_GPU(); //error occurs here
(*pdes)->Setup();
}
これを呼び出して、タイプ PDE_ParabolicD1_Num_GPU のオブジェクトを作成し、セットアップします。main() では、同じオブジェクトを使用するため、関数の引数でダブル ポインターを使用しています。main() では、次のことを行います。
PDE_ParabolicD1_Num_GPU pdes_host;
PDE_ParabolicD1_Num_GPU *pdes_dev=0;
pdegpu<<<1,1>>>(&pdes_dev);
cudaStatus = cudaMemcpy(&pdes_host, pdes_dev, sizeof(PDE_ParabolicD1_Num_GPU), cudaMemcpyDeviceToHost);
...
delete [] pdes_dev;
ただし、コードに示されているエラーが表示され、エラーに対する CUDA メモリ チェッカーの出力は次のようになります。
Memory Checker detected 1 access violations.
error = access violation on store (global memory)
gridid = 16
blockIdx = {0,0,0}
threadIdx = {0,0,0}
address = 0x0018f420
accessSize = 4
error MemoryChecker: #misaligned=0 #invalidAddress=1
私が理解している限り、invalidAddressが原因でエラーが発生しています。
誰でも問題を解決するのを手伝ってもらえますか? ありがとうございました