我有一些疑问。
最近我正在使用 CUDA 制作一个程序。
在我的程序中,Host 上有一个用 std::map(string, vector(int)) 编程的大数据。
通过使用这些数据,一些向量(int)被复制到 GPU 全局内存并在 GPU 上处理
处理后,在 GPU 上生成一些结果,并将这些结果复制到 CPU。
这些都是我的节目表。
- cudaMemcpy( ... , cudaMemcpyHostToDevice)
- 内核函数(内核函数只有在必要的数据被复制到 GPU 全局内存时才能完成)
- cudaMemcpy( ... , cudaMemcpyDeviceToHost)
- 重复 1~3 步 1000 次(对于另一个数据(向量))
但我想减少处理时间。
所以我决定在我的程序中使用 cudaMemcpyAsync 函数。
在搜索了一些文档和网页后,我意识到要使用 cudaMemcpyAsync 函数主机内存,其中有数据要复制到 GPU 全局内存必须分配为固定内存。
但是我的程序正在使用std::map,所以我不能把这个std::map数据放到固定内存中。
所以我没有使用这个,而是创建了一个缓冲区数组类型的固定内存,这个缓冲区总是可以处理复制向量的所有情况。
最后,我的程序是这样工作的。
- Memcpy(使用循环将数据从 std::map 复制到缓冲区,直到将整个数据复制到缓冲区)
- cudaMemcpyAsync( ... , cudaMemcpyHostToDevice)
- 内核(内核函数只有在将整个数据复制到 GPU 全局内存时才能执行)
- cudaMemcpyAsync( ... , cudaMemcpyDeviceToHost)
- 重复 1~4steps 1000 次(对于另一个数据(向量))
我的程序变得比以前的情况快得多。
但问题(我的好奇心)就在这一点上。
我试图以类似的方式制作另一个程序。
- Memcpy(仅将数据从 std::map 复制到一个向量的缓冲区)
- cudaMemcpyAsync( ... , cudaMemcpyHostToDevice)
- 循环 1~2 直到整个数据复制到 GPU 全局内存
- 内核(内核函数只有在必要的数据被复制到 GPU 全局内存时才能执行)
- cudaMemcpyAsync( ... , cudaMemcpyDeviceToHost)
- 重复 1~5steps 1000 次(对于另一个数据(向量))
这种方法比上面讨论的方法快了大约 10%。
但我不知道为什么。
我认为 cudaMemcpyAsync 只能与内核函数重叠。
但我的情况我认为不是。而不是看起来可以在 cudaMemcpyAsync 函数之间重叠。
对不起我的长问题,但我真的很想知道为什么。
有人可以教我或向我解释什么是确切的设施“cudaMemcpyAsync”以及哪些功能可以与“cudaMemcpyAsync”重叠?