小编Abd*_*dul的帖子

关于cudaMemcpyAsync功能

我有一些问题.

最近我正在使用CUDA制作一个程序.

在我的程序中,主机上有一个大数据用std :: map(string,vector(int))编程.

通过使用这些数据,一些vector(int)被复制到GPU全局内存并在GPU上处理

处理完成后,会在GPU上生成一些结果,并将这些结果复制到CPU.

这些都是我的课程安排.

  1. cudaMemcpy(...,cudaMemcpyHostToDevice)
  2. 内核函数(只有在必要的数据被复制到GPU全局内存时才能完成内核函数)
  3. cudaMemcpy(...,cudaMemcpyDeviceToHost)
  4. 重复1~3步1000次(另一个数据(矢量))

但我想减少处理时间.

所以我决定在我的程序中使用cudaMemcpyAsync函数.

在搜索了一些文档和网页后,我意识到要使用cudaMemcpyAsync函数主机内存,其中有数据要复制到GPU全局内存必须分配为固定内存.

但是我的程序正在使用std :: map,所以我无法将这个std :: map数据转换为固定内存.

因此,我没有使用它,而是制作了一个缓冲数组类型的固定内存,这个缓冲区总能处理所有复制矢量的情况.

最后,我的程序像这样工作.

  1. Memcpy(使用循环将数据从std :: map复制到缓冲区,直到整个数据被复制到缓冲区)
  2. cudaMemcpyAsync(...,cudaMemcpyHostToDevice)
  3. 内核(只有在将整个数据复制到GPU全局内存时才能执行内核函数)
  4. cudaMemcpyAsync(...,cudaMemcpyDeviceToHost)
  5. 重复1~4步1000次(另一个数据(矢量))

我的程序变得比前一个案例快得多.

但问题(我的好奇心)就是在这一点上.

我尝试以类似的方式制作另一个程序.

  1. Memcpy(将数据从std :: map复制到缓冲区仅用于一个向量)
  2. cudaMemcpyAsync(...,cudaMemcpyHostToDevice)
  3. 循环1~2直到整个数据被复制到GPU全局内存
  4. 内核(只有在必要的数据复制到GPU全局内存时才能执行内核函数)
  5. cudaMemcpyAsync(...,cudaMemcpyDeviceToHost)
  6. 重复1~5步1000次(另一个数据(矢量))

该方法比上述方法快约10%.

但我不知道为什么.

我认为cudaMemcpyAsync只能与内核函数重叠.

但我的情况我认为不是.而不是它看起来可以在cudaMemcpyAsync函数之间重叠.

抱歉我的问题很长,但我真的很想知道原因.

有人可以教我或解释一下具体的设施"cudaMemcpyAsync"以及哪些功能可以与"cudaMemcpyAsync"重叠?

cuda

6
推荐指数
1
解决办法
9784
查看次数

使用多个CUDA GPU

我正在使用NVIDIA Grid K2进行CUDA编程.它有两个GPU,每个GPU有1536个核心.是否可以在单个或多个内核调用中使用这两个GPU?

cuda

6
推荐指数
1
解决办法
852
查看次数

标签 统计

cuda ×2