学了两周CUDA,现在对基本的编程有了一定的认识,即将进入实践阶段,那么我有几个问题想请教论坛达人:
1.我要做科学计算,因此用到很多矩阵向量的乘法,转置,求范数等操作,那么cublas这个库诸位在实践过程中用的多吗,我看到这个库提供了非常实用的函数命令,类似于Linux下的GSL,我有个代码是GSL写的,因此转换一下将非常方便,就是不清楚用这个库的效率如何?毕竟GPU还是希望能速度上快一点。
2.我目前显卡的显存是1G,内存4G,而我待处理的数据是8G,直接用应该是不行的,因为首先我内存就不够,因此我的思路是将8G的数据分成16块先保存在硬盘上,每份就是512M,先在主机端顺序读取这16份数据,再依次cudaMemcpy一份到GPU中操作,这个过程需要“排队”,因为GPU无法一次性处理那么多,再将每次从GPU中运算的结果返回到CPU中去(输出的数据量则非常少,每次只有1M左右),CPU中再对这些结果处理再将它们送到GPU中,也就是需要一个串行+并行+串行+并行…的过程,每次放入GPU的数据都比较多,返回到CPU中处理的很少。 那么我想问我这个思路可以吗,数据通信会不会非常占时间,因为真的要多次往GPU中交换数据,有没有更好的方法,如果可行那么利用CUDA实现数据“排队”该如何操作,SDK里有没有现成的代码供参考呢:loveliness:?
LZ您好:
1:因为我基本不用该库,尚不能回答您的问题,请其他熟悉该库的网友补充。
2:主机端如何从硬盘中读取数据,这个和CUDA使用无关的,你可以选择任何方便快捷的方式。
如果您的数据可以分块读入GPU处理,那么您多少可以通过多stream掩盖一些传输时间的。
以及,如果可能,请尽量将所有的判断放在GPU端,尽量减少CPU和GPU的交互。
以及,如果要考虑从硬盘读出时间的话,您的总时间很可能受到硬盘IO速度的影响,请您评估各部分的耗时,然后综合处理。
以及不是很理解您“排队”的意思,如有需要,请您稍微详细叙述下。
大致如此,祝您好运~
谢谢版主,嗯,我第二个问题简要的说就是当要处理的数据量(8G)超过GPU显存容量(1G)的时候,该如何实现?排队的意思就是希望这些数据一批一批的放到GPU中,进去一批处理后返回结果到CPU再进去一批,我不知道这个过程该怎么搜关键词或者代码,还请版主指点。
楼主您好,这叫staging, 不叫排队的。
这个如果您的算法允许当前只处理一部分,然后下次另外一部分,部分和部分之间无重合,则您显然可以分批进去的。
但是请您注意刚才ICE说的两点:
(1)如果处理很少的话,您需要注意ICE的建议:您的整个过程可能卡在反复的数据传输上,而不是计算上,这种情况请您考虑不使用CUDA, 就地对这些少量处理解决掉。
(2)如果任何不怕1这种情况,您可以考虑ICE的建议,使用多个流,尽量掩盖。
感谢来访。
好,多谢!我去看下流处理:loveliness: