私はしばらくの間、この問題にかなり困惑してきました。これには、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を使用しています。