【问题标题】:Using a data pointer with CUDA (and integrated memory)将数据指针与 CUDA(和集成内存)一起使用
【发布时间】:2015-06-19 01:28:17
【问题描述】:

我正在使用集成了 gpu 和 cpu 内存的板。我还在使用外部矩阵库(Blitz++)。我希望能够从矩阵对象中获取指向我的数据的指针并将其传递给 cuda 内核。在进行了一些挖掘之后,听起来我想通过调用cudaHostGetDevicePointer 来使用某种形式的零副本。我不确定的是内存的分配。我必须使用cudaHostAlloc 创建指针吗?如果我不需要的话,我不想重写 Blitz++ 来做cudaHostAlloc

我的代码目前有效,但每次都会复制矩阵数据。这在集成存储卡上是不需要的。

【问题讨论】:

  • 你不能让 Blitz++ 在你用 cudaHostAlloc 预分配的内存上工作吗?还是 blitz 本身就负责所有的内存管理?
  • @JorenHeit 这最初可能有效,但在我们的整个代码中,我们都使用了改变大小的函数。这意味着要么重写 blitz++,要么寻找每一个会改变分配的内存地址的函数调用。听起来都不是很有趣......
  • blitz 是否接受像std::vector 这样的 STL 容器?如果是这样,您可以编写一个使用 cudaHostAlloc... 的自定义分配器
  • @JorenHeit 这确实值得研究。有计划最终删除 blitz,所以我想我可以将 blitz 包装在某种适配器中,以确保正确分配(正如您的第一条评论所建议的那样。)这将使最终的重构更容易,但这也意味着我必须实现表达式模板...糟糕。

标签: c++ memory-management cuda


【解决方案1】:

必须使用cudaHostAlloc 创建(即分配)指针,即使在像 Jetson 这样的集成系统上也是如此。

原因是 GPU 需要(零拷贝)内存被固定,即从主机需求分页系统中移除。普通分配受需求分页影响,不能用作零拷贝,即 GPU 的 映射内存。

【讨论】:

    猜你喜欢
    • 2015-03-26
    • 2017-04-30
    • 2011-09-27
    • 1970-01-01
    • 2013-09-22
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    相关资源
    最近更新 更多