【问题标题】:CUDA new deleteCUDA 新删除
【发布时间】:2016-04-19 10:46:12
【问题描述】:

如果从 CUDA 4.2 中的 __device____global__ 代码调用 new 和 delete 关键字的行为,有人可以清楚地解释一下吗?

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

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

谢谢!

【问题讨论】:

    标签: cuda dynamic-memory-allocation


    【解决方案1】:

    C++ newdelete 对设备堆内存进行操作。该设备允许以这种方式分配一部分全局(即板载)内存。 newdelete 的工作方式与 device malloc and free 类似。

    您可以使用runtime API call 调整堆可用的设备全局内存量。

    您可能也对C++ new/delete sample code.感兴趣

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

    【讨论】:

    • 非常感谢!这是有道理的。
    • @Twiltie:使用__device__ malloc()/free()new/delete 会对性能产生负面影响。见stackoverflow.com/a/13485322/442006
    • @RogerDahl:我明白了,我必须记住这一点。我正计划用它在 GPU 上创建和训练神经网络,以玩康威人生游戏的一种特殊形式。我计划进行基因训练,所以也许我会对活动神经网络的数量设置一个固定的限制,然后只分配一次。感谢您的洞察力!
    • @Twiltie:还要检查您是否可以使用本地、固定大小的 C 数组代替 (int myvalues[200];);如果您使用__device__ malloc() 或者如果您为每个线程分配单独的内存块,则不会获得完全合并的内存访问。这是因为,当一个 warp 中的 32 个线程处理执行加载或存储的指令时,每个线程从按分配块大小分隔的位置读取,而理想情况下,它们应该读取相邻的值。编译器以交错方式存储固定大小的 C 数组,使访问能够完全合并。
    • SDK 中的 new/delete 示例代码是一个很好的例子,展示了放置 new 如何帮助利用共享内存。感谢您指出!
    猜你喜欢
    • 1970-01-01
    • 2017-08-08
    • 2012-02-17
    • 2019-04-09
    • 2016-03-08
    • 2019-10-19
    • 2019-01-10
    • 2012-05-30
    相关资源
    最近更新 更多