【问题标题】:How to make vector-type-value to pinned memory in cuda如何在 cuda 中将向量类型值设置为固定内存
【发布时间】:2012-09-17 16:24:33
【问题描述】:

我对制作固定记忆有疑问。

现在我正在使用 CUDA 来处理大量数据。

为了减少运行时间,我发现有必要让内存复制和内核启动重叠。

在搜索了一些文本和网页之后,为了重叠内存复制和内核启动,我注意到有必要使用 cudaMallocHost 分配主机内存,它将主机内存分配给固定内存。
在主机上使用整数或数组类型的情况下,很容易做pinned memory。

就这样……

cudaStream_t* streams = (cudaStream_t*)malloc(MAX_num_stream * sizeof(cudaStream_t));
for(i=0; i<MAX_num_stream; i++)
    cudaStreamCreate(&(streams[i]));

cudaMallocHost(&departure, its_size);

for(n=1; ... ; n++){
   cudaMemcpyAsync( ... streams[n]);
   kernel <<< ... , ... , ... , streams[n] >>> (...);
}

但在我的情况下,我的主机离开内存是由变频器类型设置的。

而且我找不到任何使用 cudaMallocHost 将向量类型主机内存转换为固定内存的方法。

帮助我或提供一些建议来解决这个问题。 感谢您阅读我蹩脚的英语。谢谢。

【问题讨论】:

  • “向量类型”到底是什么意思?你是指 C++ std::vector,还是别的什么?
  • 是的。我的意思是 std::vector。

标签: cuda


【解决方案1】:

直接,您不能使用cudaMallocHost 为任何其他 POD 类型分配内存。

如果您真的需要使用固定内存的std::vector,则必须实现自己的std::allocator 模型,该模型在内部调用cudaMallocHost,并使用该自定义实例化您的std::vector分配器。

另外,thrust template library(在最新版本的 CUDA 工具包中提供)包括一个实验性固定内存分配器,您可以将其与推力自己的向量类一起使用,它本身就是 std::vector 的模型。

【讨论】:

  • 感谢 talonmies。这些内容对我的情况很有帮助。
  • 我还有一个小问题。可以在没有 cudaMallocHost 的情况下使用 cudaMemcpyAsync 和内核吗?我试图在不制作主机固定内存的情况下制作异步代码,但这很好用。是普遍的还是偶然的?
  • 是的,它会起作用,但对于任何大于 64kb 的传输,传输不会在设备上异步。主机 API 调用立即返回,但设备被阻塞,直到复制完成,即。没有同时执行内核和内存复制或cudaMemcpyAsync 的任何其他好处。
  • 非常感谢。我想知道它是因为使用 cudaMemcpyAsync 和内核而不使用固定内存的测量运行时间比不使用 cudaMemcpyAsync 的情况短一点。现在我猜这是一些传输
猜你喜欢
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
  • 2013-05-01
  • 1970-01-01
  • 2013-10-16
  • 2013-10-06
  • 2011-08-09
  • 2018-10-05
相关资源
最近更新 更多