关于多GPU并行

gong_xufei 2011-07-30 02:16:02
之前一直在做单GPU的并行,现在要做多个GPU卡的并行,主要是想联合使用多个GPU的显存,有几个问题期望与各位交流一下

①多GPU并行是不是只有CUDA4.0及其之后才支持?

②多GPU并行对GPU卡有没有要求?Tesla C1060是否支持?

③多GPU并行是单个CPU线程下多个GPU的协作,还是多个CPU线程(每个线程一个GPU)之间的协作?

④有啥好的关于多GPU并行的资料或者学习网站分享一吧~
...全文
3387 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
浴血中条 2013-12-02
  • 打赏
  • 举报
回复
在MATLAB或者maple上面可以先练练手 就几句话。
salttz 2013-05-24
  • 打赏
  • 举报
回复
请问你的问题解决了没有?最终怎么实现的?
alpha.5 2012-04-16
  • 打赏
  • 举报
回复
高性能计算 对并行的要求是无穷尽的.
dianwei_wang 2011-11-20
  • 打赏
  • 举报
回复
还没见识过什么呀的应用中回需要多个GPU并行操作。我们的一个就足够了。。。
stellarman 2011-11-19
  • 打赏
  • 举报
回复
我个人的经验有三种模式:
MPI+CUDA
Pthread or OpenMP + CUDA
streams+ CUDA
老所 2011-09-06
  • 打赏
  • 举报
回复
建议楼主去看看CUDA Driver API,在CUDA Runtime API中,实际上屏蔽了很多显示的对多GPU的操作,比如Context,一个GPU设备可以有多个Context进行切换,但一个Context只能适用于一个GPU设备。
zhangdc318 2011-08-17
  • 打赏
  • 举报
回复
学习了
OpenHero 2011-08-08
  • 打赏
  • 举报
回复
4.0有一些新特性需要tesla卡支持
beyond071 2011-08-05
  • 打赏
  • 举报
回复
哈哈,不好意思啊!我的知识过时了,CUDA4.0果然是支持一个主线程并行执行多GPU的,我这还是老思想...
beyond071 2011-08-05
  • 打赏
  • 举报
回复
楼主,在主线程中无论是隐式或是显式调用了cudaSetDevice选择了设备,就不能再调用cudaSetDevice更改主机端所使用的设备。

我是没有硬件条件,像这种并不是很难的问题不用推测,直接写个代码去验证想法就OK了。
beyond071 2011-08-04
  • 打赏
  • 举报
回复
真可惜,我也没有实际做过多个GPU的程序,只是看资料...只有等有点money的时候自己买几块来攒个超级计算机了:)

我只了解过多线程控制多GPU计算的,可以用多线程库/OPENMP/线程池,各个线程使用cudaSetDevice来关联相应的GPU设备。Host端分配多线程,线程可以超过GPU数目,但运作过程中还是一一对应。

楼主提过的stream,我觉得不是很靠谱。我实际使用中感觉流只是通过异步,将单个GPU中数据传输和计算叠加起来提速。stream没有控制具体在哪个device上执行的参数,cuda应该也没有自动把stream分配到所有device的能力。不知道楼主有没有不通过多线程,而只靠流来进行多GPU运算的实例程序呢。

gong_xufei 2011-08-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 beyond071 的回复:]
真可惜,我也没有实际做过多个GPU的程序,只是看资料...只有等有点money的时候自己买几块来攒个超级计算机了:)

我只了解过多线程控制多GPU计算的,可以用多线程库/OPENMP/线程池,各个线程使用cudaSetDevice来关联相应的GPU设备。Host端分配多线程,线程可以超过GPU数目,但运作过程中还是一一对应。

楼主提过的stream,我觉得不是很靠谱。我实际使用中感觉流……
[/Quote]
在另一个论坛上看到有人提到这个是用单线程控制多个GPU的,但具体方法不详(http://cudabbs.it168.com/thread-234-1-1.html)
关于stream我也没用过,只是从看到的一些资料的推测
关于"stream没有具体控制在哪个device上执行的参数",我的理解是,这是反过来做的
也就是,先cudaSetDevice(),然后创建当前设备的stream,而后将内核执行或者存储拷贝发射到当前的流,
如此实现多个设备上的多个流的运行:
cudaSetDevice(0); // Set device 0 as current
cudaStream_t s0;
cudaStreamCreate(&s0); // Create stream s0 on device 0
MyKernel<<<100, 64, 0, s0>>>(); // Launch kernel on device 0 in s0
cudaSetDevice(1); // Set device 1 as current
cudaStream_t s1;
cudaStreamCreate(&s1); // Create stream s1 on device 1
MyKernel<<<100, 64, 0, s1>>>(); // Launch kernel on device 1 in s1

或者再进一步,不再考虑流直接这样做:
cudaSetDevice(0); // Set device 0 as current
MyKernel_0<<<100, 64, 0>>>(); // Launch kernel on device 0
cudaSetDevice(1); // Set device 1 as current
MyKernel_1<<<100, 128, 0>>>(); // Launch kernel on device 1
这样可不可以呢?因为好像MyKernel_0发射完成后,HOST段就立即获得返回值了吧,也就是可以继续进行了吧(是不是?)然后就可以选择另一个设备发射MyKernel_1了吧,这样不就是同时两个device上都有kernel在运行?
gong_xufei 2011-08-03
  • 打赏
  • 举报
回复
楼上
"多GPU并行是一个CPU 线程控制一个GPU。"
sure?这个听着比较可怕呀

我看了点资料,有点理解
就是分别在多个GPU下创建stream,由CPU在相应的GPU上启动这些stream
(因为在一个GPU上发完任务后,kernel会立刻返回,这样cpu就可以接着操作另一个GPU了)
考不靠谱?

beyond071 2011-08-01
  • 打赏
  • 举报
回复
关注一下,本人也没有实际做过多GPU的并行运算,不过从资料上了解过。
多GPU并行在CUDA4.0之前就可以做,只是GPU算完后要靠CPU来做同步工作,数据需要拷贝回CPU,而CUDA4.0在多GPU上增强了功能,比如GPU之间直接传输数据。
多GPU并行没有说一定要同样类型的卡,只要支持CUDA的就可以。
多GPU并行是一个CPU 线程控制一个GPU。
多GPU的资料比较少,也希望大家多分享分享。

353

社区成员

发帖
与我相关
我的任务
社区描述
CUDA高性能计算讨论
社区管理员
  • CUDA高性能计算讨论社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧