我总是读到它分配和传输数据到CPU的速度很慢。这是因为cudaMalloc速度慢吗?是因为cudaMemcpy速度慢吗?或者它是否因为它们都很慢?Cuda cudaMemcpy和cudaMalloc
2
A
回答
3
它主要与2件事有关,第一件事开始卡和CPU之间的PCIExpress总线的速度。另一个与这些功能的运作方式有关。现在,我认为新的CUDA 4可以更好地支持内存分配(标准或固定)以及通过总线透明访问内存的方式。
现在,让我们面对它,在某些时候,您需要从点A到点B的数据来计算一些东西。最好的处理方式是要么进行非常大的计算,要么使用CUDA流来重叠GPU上的传输和计算。
3
在大多数应用程序中,您应该在开始时执行一次cudaMalloc,然后不再调用它。因此,瓶颈真的是cudaMemcpy。
这是由于物理限制。对于一个标准的PCI-E 2.0 x16链路,你可以得到8GB/s的理论值,但实际上通常为5-6GB/s。比较这个w /甚至是一个中等范围的Fermi,就像GTX460那个设备上有80 + GB/s的带宽。实际上,内存带宽的命中率达到了一个数量级,因此您的数据传输时间也相应增加。
GPGPU应该是超级计算机,我相信Seymour Cray(超级计算机家伙)说,“一台超级计算机将计算受限的问题转化为I/O约束问题”。因此,优化数据传输就是一切。
根据我个人的经验,迭代算法是通过移植到GPGPU(2-3个数量级)显示最佳改进的算法,因为您可以通过将所有内容保持在原位来消除传输时间GPU。
相关问题
- 1. CUDA Zero Copy与Jetson上的CudaMemcpy TK1
- 2. CUDA,试图在设备
- 3. CUDA到设备错误
- 4. cudaMalloc和“内存不足”问题
- 5. CUDA点积
- 6. CUDA NPP GaussFilter破坏图像
- 7. Makefile for Gtk +和cuda
- 8. CUDA内存限制
- 9. CUDA上的块间屏障
- 10. 复制到CUDA到设备内存CUDA
- 11. Cuda矩阵乘法
- 12. CUDA 8.0 - cudaMemcpy() - 线性或恒定时间操作?
- 13. CudaMalloc如何工作?
- 14. CUDA Globel变量
- 15. Golang调用CUDA库
- 16. 内核函数和cudaMemcpy
- 17. CUDA程序输出错误
- 18. CUDA分段错误
- 19. cudaMemcpy&blocking
- 20. CUDA:一个struct
- 21. 在CUDA分配中的SIGSEGV
- 22. 添加两个数字CUDA
- 23. C++类和CUDA错误
- 24. CUDA使用CMake的
- 25. 如何动态创建cudaMalloc
- 26. cuda“预计类型说明符”
- 27. 叮当中的CUDA支持
- 28. 如何:CUDA IFFT
- 29. cudaBindTexture2D上的CUDA错误
- 30. CUDA内核不重叠
在我的情况下是相反的......我做一个cudaMemcpy和很多cudaMalloc .... – Lora 2011-05-05 14:18:37
你能谈谈更多关于你的应用程序吗?你只是保留许多转换的副本? – peakxu 2011-05-05 15:06:21
以及在我的情况下,我有一个输入...但我无法检测到我需要分配多少内存来解决这个输入。因此我做了一个输入的副本....并在需要时分配全局内存。换句话说,当前一个内存已满时,我分配新的内存。 (请注意,我将需要所有分配的内存来计算完整的结果...) – scatman 2011-05-06 07:40:05