我目前正在参与开发一个大型科学计算项目,我正在探索使用GPU进行硬件加速的可能性,作为MPI /集群方法的替代方案。我们处于一种主要受内存限制的情况,有太多的数据要放在内存中以适应GPU。为此,我有两个问题:
1)我读过的书说,在设备上用指针访问主机上的内存是违法的(出于显而易见的原因)。相反,必须将内存从主机的内存复制到设备内存,然后进行计算,然后复制回来。我的问题是,是否有解决办法 - 是否有任何方式从GPU读取系统RAM中的值?
2)更一般地说,在这些内存绑定计算期间,优化CPU和GPU之间的数据传输有哪些算法/解决方案?
感谢您的帮助!我很热衷于切换到CUDA,因为并行化更加直观!
答案 0 :(得分:3)
1)是的,您可以使用大多数GPGPU软件包执行此操作。
我最熟悉的那个 - AMD Stream SDK允许您在“系统”内存中分配缓冲区,并将其用作内核读取或写入的纹理。 Cuda和OpenCL具有相同的能力,关键是在缓冲区分配上设置正确的标志。
但是...
您可能不希望这样做,因为正在通过PCIe总线读取/写入数据,这会产生很多开销。
实施可以自由地解释您的请求。我的意思是你可以告诉它在系统内存中找到缓冲区,但是软件堆栈可以自由地执行诸如动态地将其重新定位到GPU内存中 - 只要计算结果是相同的
2)所有主要的GPGPU软件环境(Cuda,OpenCL,Stream SDK)都支持DMA传输,这是您可能想要的。
答案 1 :(得分:0)
即使你可以做到这一点,你可能也不会这样做,因为通过PCI传输 - 无论是什么都会成为瓶颈,而GPU和它自己的内存之间的带宽通常非常高高。
话虽如此,如果你在大型数据集上执行每个元素的计算量相对较少,那么无论如何GPGPU可能都不适合你。
答案 2 :(得分:0)
我建议使用cuda编程指南。 你会在那里找到很多答案。 检查流,统一寻址,cudaHostRegister。