0

クラス オブジェクトをグローバル カーネルに渡し、そのメンバー関数を実行したいと考えています。これまでの私の努力はすべて失敗に終わっています。以下では、私がやろうとしていることの詳細な説明をしています。

クラス PDE_Parabolic_Num_GPU を次のように実装しました。

class PDE_Parabolic_Num_GPU: public PDE_Parabolic_GPU
 {
  public:
   __host__ __device__ PDE_Parabolic_Num_GPU();
   __host__ __device__ ~PDE_Parabolic_Num_GPU();
   __host__ __device__ Solve();
   __host__ __device__ Setup();
   ...

  //data
  gdd_real*   an;
  gdd_real*   bn;
  gdd_real*   cn;
}

gdd_real の場所

struct gdd_real 
{
    double2 val;
        __host__  __device__ gdd_real(double hi, double lo) {val.x = hi; val.y = lo;}
    __host__  __device__ gdd_real(double h){val.x = h; val.y = 0.;}
    __host__  __device__ gdd_real(){};
};

main() では、クラス オブジェクトをグローバル カーネルに渡すために、通常の cudaMalloc と cudaMemcpy を実行しています。

PDE_Parabolic_Num_GPU pdes_host;
PDE_Parabolic_Num_GPU *pdes_dev;
cudaError_t cudaStatus;
cudaStatus = cudaMalloc((void**)&pdes_dev, 1 * sizeof(PDE_Parabolic_Num_GPU));
cudaStatus = cudaMemcpy(pdes_dev, &pdes_host, sizeof(PDE_Parabolic_Num_GPU), cudaMemcpyHostToDevice);
pdegpu<<<1,1>>>(pdes_dev);
cudaStatus = cudaThreadSynchronize();
cudaStatus = cudaMemcpy(&pdes_host, pdes_dev, sizeof(PDE_Parabolic_Num_GPU), cudaMemcpyDeviceToHost);
cudaStatus = cudaThreadExit();
system("pause");

pdegpu カーネルは次のとおりです。

__global__ void pdegpu(PDE_Parabolic_Num_GPU *pdes)
{
  pdes->Setup(); //initializes class members an, bn, cn using "new" 
  pdes->Solve();    
}

私の最初の問題: デバッグ中に pdes->Setup() でプログラムがクラッシュします。

2 つ目の問題は、次のようにカーネルをローカル オブジェクトを使用するように変更すると、デバッグ中に main() の system("pause") ステートメントの後でプログラムがクラッシュすることです。

__global__ void pdegpu()
{
      PDE_Parabolic_Num_GPU pdes;  //using local object
      pdes.Setup(); 
      pdes.Solve(); 
}

これらは、Nsight を使用したデバッグ中にプログラムがクラッシュする 2 つのケースです。しかし、デバッグせずにプログラムを実行すると、(ローカル オブジェクトを使用する) pdegpu の 2 番目のバージョンが pdes.Solve() でクラッシュします。誰でもこれらの問題を解決するのを手伝ってもらえますか? ありがとうございました、

4

1 に答える 1

1

なぜあなたはへのポインタを保存しているのgdd_realですか?このタイプのオブジェクトをクラスに直接配置することができます。このようにして、メモリ関連の問題を回避できます。

では、なぜ使用しないのですか?

    //...
    gdd_real   an;
    gdd_real   bn;
    gdd_real   cn;
}
于 2013-01-30T19:37:14.320 に答える