gpt4 book ai didi

c++ - 将带有数组指针的类从 C++ 传递到 CUDA

转载 作者:行者123 更新时间:2023-11-30 04:26:29 33 4
gpt4 key购买 nike

我在 C++ 中有以下类:

template<typename T>
class dynArray {

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

有没有什么方法可以使用 cudaMemcpy() 复制此类的对象以在 CUDA 内核中使用,而无需逐个元素地复制其内容?

提前致谢。

最佳答案

最初的想法

对我来说,您似乎想要类似 std::vector<> 的东西在 GPU 上。如果您只需要 GPU 全局内存中的数据或 vector 的大小,我会给出真正考虑的建议。恕我直言,GPU 上的代码实际上应该只修改数组的数据,而不是调整数组本身的大小。这是应该在主机上完成的事情。

有一个名为 AGILE 的开源库, 它实现了一个 GPUVector基本上类似于 std::vector<>在 GPU 上。 GPUVector存储容量、大小和指向 GPU 内存的指针。在 GPUVector 上运行的内核获取指向内存区域的指针和大小作为参数,即内核调用看起来像这样:

GPUVector v;
[... initialize v...]
computationKernel<<<blockDim, gridDim>>>(v.data(), v.size());

将其翻译给您的类(class),GPUVector::data()只会返回 dynArray::elements (指向 GPU 内存)和 GPUVector::size()返回 dynArray::size . dynArray::size应该留在 CPU 端,因为您很可能不想从 GPU 代码修改它(例如,因为您不能从 GPU 调用 cudaMalloc)。如果不修改,也可以作为参数传递。

您可能想要查看的另一个库是 Thrust ,它还在 GPU 上提供了类似 STL 的 vector 。

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;
}

关于c++ - 将带有数组指针的类从 C++ 传递到 CUDA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11569408/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com