私はC++で次のクラスを持っています:
template<typename T>
class dynArray {
public:
T *elements;
int size;
int capacity;
int initCapacity;
}
cudaMemcpy()
このクラスのオブジェクトをコピーして、そのコンテンツ要素を要素ごとにコピーすることなく、CUDA カーネルで使用する方法はありますか?
前もって感謝します。
私はC++で次のクラスを持っています:
template<typename T>
class dynArray {
public:
T *elements;
int size;
int capacity;
int initCapacity;
}
cudaMemcpy()
このクラスのオブジェクトをコピーして、そのコンテンツ要素を要素ごとにコピーすることなく、CUDA カーネルで使用する方法はありますか?
前もって感謝します。
std::vector<>
私には、GPU のようなものが必要なようです。GPU グローバル メモリ内のデータのみが必要な場合、またはベクトルのサイズも必要な場合は、実際に検討するようアドバイスします。私見、GPU 上のコードは実際には配列のデータのみを変更する必要がありますが、配列自体のサイズを変更する必要はありません。これは、ホストで実行する必要があります。
AGILEと呼ばれるオープンソース ライブラリがあり、GPUVector
これは基本的std::vector<>
に GPU のようなものを実装しています。はGPUVector
、容量、サイズ、および GPU メモリへのポインターを格納します。上で動作するカーネルはGPUVector
、メモリ領域へのポインタとサイズを引数として取得します。つまり、カーネル呼び出しは次のようになります。
GPUVector v;
[... initialize v...]
computationKernel<<<blockDim, gridDim>>>(v.data(), v.size());
これをクラスに変換すると、GPUVector::data()
( GPU メモリdynArray::elements
を指す)が返され、 が返されます。ほとんどの場合、GPU コードから変更したくないため (たとえば、GPU から呼び出すことができないため)、CPU 側にとどまる必要があります。変更しない場合は、パラメーターとして渡すこともできます。GPUVector::size()
dynArray::size
dynArray::size
cudaMalloc
あなたが見たいと思うかもしれない別のライブラリはThrustで、これも GPU で STL のようなベクトルを提供します。
配列全体をコピーすることが依然として望ましいため、次のアプローチをお勧めします。
template<typename T>
class dynArray
{
public:
//! Copies this dynArray to the GPU and returns a pointer to the copy.
void* copyToDevice()
{
// Copy the dynArray to the device.
void* deviceArray;
cudaMalloc(&deviceArray, sizeof(dynArray<T>));
cudaMemcpy(deviceArray, this, sizeof(dynArray<T>),
cudaMemcpyHostToDevice);
// Copy the elements array to the device.
void* deviceElements;
cudaMalloc(&deviceElements, sizeof(T) * capacity);
cudaMemcpy(deviceElements, elements, sizeof(T) * capacity,
cudaMemcpyHostToDevice);
// On the device, the elements pointer has to point to deviceElements.
cudaMemcpy(deviceArray, deviceElements, sizeof(T*),
cudaMemcpyHostToDevice);
return deviceArray;
}
T *elements;
int size;
int capacity;
int initCapacity;
}
element
配列の内容を個別にコピーする必要があるため、ポインターが問題になると思います。elements
そうすると、ポインターが台無しになります(つまりelement
、GPU上の配列を指さなくなります)。要素配列とサイズ/容量の値を別々にコピーすることをお勧めします。