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