问题如题。
本人做的计算内存需求较大。例如分解一个超大规模的稀疏矩阵,用分布式并行,1024核 ,每个核需要0.6G左右的内存。 本人为GUDA新手,不理解CUDA处理此类问题有什么技巧。 貌似必然要频繁访问主机内存。不知道CUDAdirect有多大改善。 如何突破访问内存的瓶颈,尚未得其要领,请高手指教。
一般来说,超出单个GPU显存的部分要做人为拆分处理的。
如果您的算法可以将数据拆分为多个不相关或者只需要同步边界数据的数据块,那么可以使用多个GPU来处理。
如果您的算法计算复杂度很高,而数据传输压力不大,也可以一块块地依次传入单一GPU的显存然后计算,可以通过stream来用计算掩盖传输数据的时间。
如果您的算法需要反复和内存交换数据,而使得GPU大量时间处于空闲状态,请尝试修改算法,或者放弃使用GPU加速。
目前单一GPU所能掌控的显存还是要远少于单一CPU可以控制的内存。
对于超大规模稀疏矩阵不了解,无法给出建议。
谢谢回复。
我理解的拆分处理,是将每个块再进行拆分,“一块块地依次传入单一的GPU显存计算”,这也是从主机内存传入GPU显存,然后将计算结果传回主机内存,是吗?
单一GPU的显存与主机内存比没少太多,也有8G的,只是相对核心数量就少太多了。
超大规模矩阵是经典问题,我估计有不少人在做,只是在网上查到的资料不多,都是规模比较小的。
1:我上面说的拆分处理是就一般意义而言的,具体到你的算法需要你自行考虑是否可行。
这包括
1)比如说如果你有两块GPU,每块GPU有1GB的显存,而你需要完成一个2GB显存占用的问题,那么你可以将2GB的数据拆分为2个1GB的数据块,每个GPU负责1GB。如果这个拆分在算法上是可行的,那么你可以使用2个GPU来完成工作。这样避免了反复在GPU的显存和CPU的内存之间通过pci-e总线传递数据。简单说,就是尽量让数据一直保存在显存里面。
2)如果只有1块GPU,但您的计算时间足以掩盖数据传输的时间,那么可以考虑用stream,一边计算,一边传输。举例而言,假如你有一块GPU,有1GB的显存,用GPU计算处理这1GB数据的时间和从主机读入并回写所用时间相当,那么可以分成2个512MB的数据,称为A,B。A计算的时候B传输,B计算的时候A传输,互相掩盖。不过鉴于GPU的计算速度很快,一般这种情况比较少见,频繁地通过pci-e总线传输数据一般讲都会严重影响GPU的运行效率。
2:单一GPU和主机内存相比还是少不少的,XEON系统,一个节点(2~4CPU NUMA的共享内存结构),内存动辄可以几百GB甚至上TB。
3:核心数目不能直接比,CPU一个核心要比GPU一个核心强大很多。
4:CPU并行/分布式可能更多偏向任务级别的并行,而GPU的线程级别的并行粒度要细很多。
超大规模矩阵,稀疏矩阵等确为经典问题,只是本人不会而已。
祝您编程愉快~
1)您说的第一条就是一般意义的分布式计算。
2)第二条,跟我上一楼理解的一样。就是对local block再进行decomposition。这样算法复杂度会增加很多(当然,可能是唯一的办法)。
3)对于绝大多数Super Computer,1~2G内存/core是基本构架。单个GPU的核心是几百乃至几千,显存相对就少两个数量级。
比较好奇采用CUDA做科学计算的人如何处理内存瓶颈这个问题。版主知道NVIDAI官方的有没有什么类似算例吗?
单个GPU的核心(cuda core)要比CPU的核心简单得多,轻量级的多,处理的问题粒度也细的多。如果要按照一个cuda core来计算,那么一个超标量的支持SIMD的CPU核心能折算出十几个甚至更多的“cores”。或者反过来,一组16个cuda cores也只相当于一个SIMD的单元而已。
所以这是两个完全不同量级的“核心”,我认为不能直接按照每个core比较显存/内存大小。
最后,不同的应用和算法有不同的要求,有些算法比较适合于全部将数据放入显存,甚至有些应用基本上不占什么显存,而只是计算密集型的。
关于NVIDIA的例子和各个行业和生态系统中的应用,敬请访问NVIDIA官网(比如美国官网)。