3

私はしばらくの間、この問題にかなり困惑してきました。これには、CUDAデバイスポインターが含まれます。デバイス上にカスタムクラスのインスタンスがあり、配列(デバイス上にある)へのポインターであるメンバー変数があります。

class MyClass {
public:
    int* array;
    // Other variables and functions, etc.
};

配列のサイズはプログラムの開始時の入力に依存するため、動的に割り当てられた配列である必要があります。プログラムの期間中、カーネル関数を使用してクラスを変更していますが、最終的には、ホスト上でこのクラスのコピーを取得してファイルに出力したいと考えています。ただし、cudaMemCpyを機能させることができないようです。

このコードを使用してクラスのコピーを取得できます(ここで、dcはデバイス上のクラスへのポインターです)。

MyClass hc;
cudaMemcpy(&hc, dc, sizeof(dc), cudaMemcpyDeviceToHost);

ただし、これはポインターではないクラス内の情報のみを取得します。これは、hcで取得されたポインターが引き続きデバイス上のデータを指しているため、意味があります。したがって、このコードを使用して実際に配列を取得できると考えました。

int* h_array;
cudaMemcpy(h_array, dc->array, sizeof(dc->array), cudaMemcpyDeviceToHost);

これは空の配列のみを返し、さらにcudaFreeエラー(「Cudaエラー:cuda free操作:無効な引数」)が発生します。hc-> arrayの使用を含め、これのバリエーションをたくさん試しましたが、成功しませんでした。個々のエントリをコピーするカーネル関数を記述せずにこの配列を取得できる方法はありますか?私はCUDA5.0を使用しています。

4

1 に答える 1

1

sizeofとポインタを間違った方法で使用していると思います。

sizeof(dc)コード内で&sizeof(dc->array)に置き換えることができます。sizeof(MyClass)ArraySize * sizeof(int)

ポインタの場合cudaMemcpy、配列を取得するには2回実行する必要があります。

  1. まず、配列のアドレスを格納するオブジェクトhcを取得します。

    cudaMemcpy(&hc, dc, sizeof(MyClass), cudaMemcpyDeviceToHost);
    
  2. 次に、配列自体を取得します。

    cudaMemcpy(h_array, hc.array, ArraySize*sizeof(int),D2H);
    

また、dcデバイスmemへのポインタです。このようなホストでは逆参照できませんdc->array

于 2013-01-10T19:08:37.753 に答える