在机器学习训练过程中,大家往往会发现IO成为制约训练速度提升的瓶颈。
提升训练速度,数据传输是绕不开的话题。那么GPU机器中,数据传输是如何做的呢?
同机的CPU和GPU之间数据如何传输?
同机的多卡之间数据如何传输?
多机的卡之间数据如何传输?
1、CPU和GPU之间
1)CPU->GPU
![8babefe88f76e471148f98db3ed40dc5.png](https://i-blog.csdnimg.cn/blog_migrate/151ae9aa5972dfaae538e7b70f1ca37a.jpeg)
从CPU向GPU传输数据,最为人熟知的就是cudaMemcpy了。
默认情况下,数据是从系统的分页内存先到锁页内存,然后再到GPU显存。因此如果显式指定使用锁页内存,是可以加快数据传输速度的。
(锁页内存,在cuda编程里使用CudaHostMalloc分配。实质上和linux的mlock系统调用一样,就是给内存页打上标记,不让操作系统将其从物理内存交换到硬盘)
至于为什么cuda要这样设计,个人理解是为了实现的方便。因为操作系统已经处理了硬盘和物理内存间的页交换等情况,显卡驱动只需要实现物理内存到GPU显存这一种数据传输即可,不需要把操作系统内存管理的事情再做一遍。
![4f719d3a802ae6d7753d3ac69c4d78ec.png](https://i-blog.csdnimg.cn/blog_migrate/8d9c7942f762692b77e0045ccc388708.jpeg)
2) GPU->CPU
GPU向CPU拷贝数据时,锁页内存同样比分页内存快
![e930b8afb3634489b8d30bc96353ab3f.png](https://i-blog.csdnimg.cn/blog_migrate/1f2c3f3bd178d7d0bb4a82725f3f7699.jpeg)
值得一提的是,适当使用pinned memory显然可以加快IO速度。但是并不是越多越好,因为锁页内存是完全独占住了物理内存,操作系统无法调度,可能会影响系统整体性能。
3)同一张GPU卡内部
同一张卡内两块显存对拷,实测P40上高达~285GB/s。也比较接近于GPU卡本身的访存速度