在内核上工作的 CUDA 上的向量

Posted

技术标签:

【中文标题】在内核上工作的 CUDA 上的向量【英文标题】:Vector on CUDA working on the Kernel 【发布时间】:2015-11-10 01:59:50 【问题描述】:

我将实现一种使用 CUDA 在 GPU 上创建 3D 模型的方法。几年前我就这样做了,但我猜 CUDA 是从那时起发展起来的,所以我尝试就如何最好地完成我将要做的事情获得一些意见。

在我的 C++ 版本中,我有一个体素向量,其中体素是一个包含浮点数的结构。该向量应该代表整个网格,我将在其中独立地对每个体素进行计算。

之前,我必须使用指针和 cudaMalloc 等才能访问设备上的体素。我正在考虑是否可以使用一些新功能。

在实际内核中是否可以使用类似于 vector 的东西?推力不合适,因为它应该从主机调用。

更有趣的是,是否可以在设备上进行动态内存分配,以便我可以在 GPU 上实现八叉树之类的东西?

这将允许进行更大规模的重建。

感谢任何想法!

编辑:

似乎必须坚持使用指针和 cudaMalloc 的经典 c 风格编码,但动态内存分配是可能的。

假设我有这个结构:

struct Data 
     float *p;
 

我从一个数组开始

Data data[10];

然后我想稍后在 data[2] 中分配一个包含 30 个浮点数的数组,你会做类似的事情

data[2].p = (float*)malloc(30*sizeof(float));

代码在 Cuda 上会是什么样子?

【问题讨论】:

请选择 C ​​和 C++ 之一。 关于您的编辑,如果这是您所说的设备代码(内核代码),它看起来完全相同 好的,但是您需要一些技巧才能将其返回给主机,因为主机无法看到您分配了什么,什么没有? 【参考方案1】:

    在实际内核中是否可以使用类似于 vector 的东西?

    不是真的,不。

    是否可以在设备上进行动态内存分配,以便在 GPU 上实现八叉树之类的东西?

    是的,计算能力 >= 2.0 的设备多年来一直支持设备代码中的动态内存分配。请注意,设备堆内存分配并不是特别快,因此除非您的代码可以重用您所做的任何分配,否则会降低性能。另请注意,您目前无法从主机 API 访问设备堆,因此如果您需要将数据传输回主机,则需要在传输内核中做一些额外的工作以将数据从堆移动到全局内存或主机零拷贝/托管缓冲区。

【讨论】:

以上是关于在内核上工作的 CUDA 上的向量的主要内容,如果未能解决你的问题,请参考以下文章

CUDA 常量内存分配是如何工作的?

Cuda 内核返回向量

将包含向量的结构传递给CUDA内核

Pytorch CUDA 错误:没有内核映像可用于在带有 cuda 11.1 的 RTX 3090 上的设备上执行

CUDA C:内核输出不良结果

CUDA 内核中映射固定主机内存上的原子操作:做还是不做?