1

多くの変数とメソッドを含む cuda デバイスで大きなクラスを複製しようとしています。クラス定義を .cuh ファイルに入れ、オブジェクトを作成してデバイス コードで使用できるようになりました。

問題は、既存のオブジェクトをホストからデバイスに取得する方法はありますか? 私はまだコードのシリアル バージョンを使用して、ジオメトリ データと物理データを読み込んでいます。中間配列などを使用せずにデバイスにコピーできる場合、デバイスは sizeof を使用せずにそのサイズをどのように処理しますか?

割り当てにこのようなものを使用しますか?

MyClass *MyObject;
int size = sizeog(MyClass);
cudaMalloc((void**)&MyObject_device, size);
cudaMemCpy(Myobject_device, MyObject, size,   cudaMemcpyHostToDevice);

アドバイスをいただければ幸いです。

4

1 に答える 1

1

CUDA コンパイラは、ホスト コンパイラで使用されるデータ構造のアライメントとパッキングに一致するように設計されています。そのため、デバイスとホストの間でオブジェクトを安全に渡し、アライメント要件に関係なくメンバーにアクセスできます。

オブジェクトをカーネル パラメーターとして直接渡すことができます。例えば:

ホスト:

MyKernel<<<grid_dim, block_dim>>>(my_object);

デバイス:

__global__ void MyKernel(MyObject my_object) {

オブジェクトの配列を渡す必要がある場合、簡単な方法は を使用することthrust::device_vectorです。例えば:

ホスト:

#include <thrust/device_vector.h>
device_vector<MyObject> my_objects;
...
MyObject* my_objects_d = thrust::raw_pointer_cast(&my_objects[0]);
MyKernel<<<grid_dim, block_dim>>>(my_objects_d);

デバイス:

__global__ void MyKernel(MyObject* my_objects) {
于 2012-11-01T22:17:55.147 に答える