如果在单独的 pthread 中使用,cublasSetMatrix 是否工作?
我想将 CPU 上的任务与 CPU->GPU 数据传输重叠。但是,由于数据非常大,我试图避免分配大的固定内存。
不,不会的。GPU 上下文与创建它们的线程相关联。如果您尝试运行cublasSetMatrix
或cudaMemcpy
在另一个线程中不做任何其他事情,它将创建另一个上下文。内存分配在上下文之间不可移植,实际上每个上下文都有自己的虚拟地址空间。结果将是您以两个 GPU 上下文结束,并且复制将失败。
固定内存的要求来自 CUDA 驱动程序。对于重叠复制和执行,复制所涉及的主机内存必须位于 GPU 可以通过 PCI-e 总线通过 DMA 访问的物理地址范围内。这就是需要固定的原因,否则主机内存可能位于交换空间或其他虚拟内存中,并且 DMA 事务将失败。
如果您担心大型问题所需的固定主机内存量,请尝试使用一两个较小的固定缓冲区并执行多个传输,将固定内存用作暂存缓冲区。性能不如使用单个大固定缓冲区和大传输,但您仍然可以实现有用的内核/副本重叠并在此过程中隐藏大量 PCI-e 延迟。