1

私はC++で次のクラスを持っています:

template<typename T>
class dynArray {

 public:
    T *elements;
    int size;
    int capacity;
    int initCapacity;
}

cudaMemcpy()このクラスのオブジェクトをコピーして、そのコンテンツ要素を要素ごとにコピーすることなく、CUDA カーネルで使用する方法はありますか?

前もって感謝します。

4

2 に答える 2

3

最初の考え

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::sizedynArray::sizecudaMalloc

あなたが見たいと思うかもしれない別のライブラリはThrustで、これも GPU で STL のようなベクトルを提供します。

dynArray のコピー メソッド

配列全体をコピーすることが依然として望ましいため、次のアプローチをお勧めします。

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;
}
于 2012-07-20T08:47:33.830 に答える
0

element配列の内容を個別にコピーする必要があるため、ポインターが問題になると思います。elementsそうすると、ポインターが台無しになります(つまりelement、GPU上の配列を指さなくなります)。要素配列とサイズ/容量の値を別々にコピーすることをお勧めします。

于 2012-07-20T07:46:37.060 に答える