CUDA新删除

CUDA新删除,cuda,dynamic-memory-allocation,Cuda,Dynamic Memory Allocation,如果从CUDA 4.2中的\uuuuu设备\uuuuuuuu或\uuuuuu全局\uuuuuuuu代码调用,是否有人能清楚地解释new和delete关键字的行为 如果内存在设备上是本地的还是全局的,那么在哪里分配内存 就问题的背景而言,我试图在GPU上创建神经网络,我想要一个链接表示(就像一个链接列表,但每个神经元都存储一个包含权重的连接链接列表,以及指向其他神经元的指针),我知道我可以在内核启动之前使用cudamaloc进行分配,但我希望内核能够控制创建网络的方式和时间 谢谢 C++new和d

如果从CUDA 4.2中的
\uuuuu设备\uuuuuuuu
\uuuuuu全局\uuuuuuuu
代码调用,是否有人能清楚地解释new和delete关键字的行为

如果内存在设备上是本地的还是全局的,那么在哪里分配内存

就问题的背景而言,我试图在GPU上创建神经网络,我想要一个链接表示(就像一个链接列表,但每个神经元都存储一个包含权重的连接链接列表,以及指向其他神经元的指针),我知道我可以在内核启动之前使用
cudamaloc
进行分配,但我希望内核能够控制创建网络的方式和时间


谢谢

C++
new
delete
操作设备堆内存。该设备允许以这种方式分配一部分全局(即车载)内存<代码>新建和
删除
的工作方式与类似

您可以使用一个函数来调整堆可用的设备全局内存量

您也可能对


这些功能需要CC 2.0或更高版本。

非常感谢!这是有道理的。@Twiltie:使用
\uuuu设备\uuuu
malloc()/free()
新建/删除
可能会对性能产生负面影响。明白了。@RogerDahl:我明白了,我必须记住这一点。我计划用它在GPU上创建和训练神经网络,以玩康威生命游戏的一种特殊形式。我计划进行基因训练,所以也许我会设定一个固定的限制来限制活动神经网络的数量,然后只分配一次。谢谢你的洞察力@Twiltie:还要检查是否可以使用本地的、固定大小的C数组(
intmyvalues[200];
);如果使用
\uuuu设备
malloc()
或为每个线程分配单独的内存块,则无法获得完全合并的内存访问。这是因为,当warp中的32个线程处理执行加载或存储的指令时,每个线程都从按分配块大小分隔的位置读取数据,而理想情况下,它们应该读取相邻的值。编译器以交错方式存储固定大小的C数组,使访问能够完全合并。SDK中的new/delete示例代码是一个很好的例子,说明了placement new如何帮助利用共享内存。谢谢你指出!