`
love19820823
  • 浏览: 935210 次
文章分类
社区版块
存档分类
最新评论

并行计算中的粒度

 
阅读更多

并发和并行:

今天和师妹讨论问题,师妹说到了现在要做的一个项目。要做大规模的并行模拟事件的模拟。问我是否可以在GPU上实现。

我们这里拿一群人来分一盒饼干来做例子。

一群人要怎么来分这些饼干啦?这里有M个饼干,有N个人要分这个饼干。

并发,就是每一个哪一个小饼干,然后各自吃各自的饼干,然后每一轮N个人就分掉了N个饼干。当然这里假设M比N大。

并行,就是N个人同时先把一个饼干分了,吃完以后再接着分下面的M-1个饼干,这样再接下去就把饼干吃完了。

这样看起来并发就比并行好了,因为每一个问题都是独立的,并发到N个处理器上面,就可以单独处理了。

但是这里有两个问题,第一个是M很小的时候,N很大,这个时候就可以采用并行的方式,让一个饼干分成很多小块,让N个人来先把一个饼干先吃完。还有当一个饼干很大的时候,一个人要吃很久才能吃完,那也可以采用并行的方式,后处理完一个还以先得到一个的结果,剩下来的慢慢处理,这个时候采用并发要等所有的处理完了才能看到整个结果,所以不一定好使。

对于并行和并发我到认为并不需要去死记硬背这些名词,只要记住并行计算,其实就是不同粒度的并发处理。

有粗粒度的,有细粒度的,不同粒度里面还可以包含不同的饼干,有巧克力饼干、有花生饼干、酥性饼干、韧性饼干、发酵(苏打)饼、薄脆饼干、曲奇饼干、夹心饼干、威化饼干、蛋圆饼干、蛋卷、黏花饼干、水泡饼干,不同的饼干也可以同时吃,所以不要讲究太多的并发或者并行,选择最适合当前的硬件架构的方法,使用最得心应手的方法,就可以了。

对于现在的GPU来讲,并行可能是比较好的选择,至少CUDA架构更适合做并行的工作,并发的工作也可以,不过得看应用,如果是并发的每一个的粒度不太一样,就需要不同的thread group同步等待,在并编程中,很忌讳等待问题,这样就成了让很多人的饼都吃完了,还看着你在吃饼,大家也只能等你把饼吃完了以后再去拿盘子里面的饼,这样会让很多人不爽的!

所以尽量做到硬件上的运行是均匀的,让硬件饱和抱起来,这样不管是并发还是并行,都可以让任务尽快的完成。


上面讨论的都是并行并非或者粒度的一些概念性的东西,我们可以看看硬件的并发,现在我们可以把这个架构分成三层,一个是集群层面,看么一个节点的工作这个就可以算是粗粒度,然后是每一个节点内的的每一个core或者GPU内部,这个可以算是细粒度的并行。在每一个层面都需要有好的算法来选择粒度的划分,如果把要处理的数据看做是一对面粉,那就需要选择最优的流程来做饼干,然后选择最好的分配方法分给大家。

数据的划得根据每一个处理节点的处理能力,还要考虑每一个节点的传输效率,精良做到有一部分面粉在和面,有一部分面粉在烤饼干,还有一部分饼干已经可以吃了,还有就是吃完了……这样尽量让网络带宽最优,使用率最好,然后每一个硬件的处理能力都发挥到极致,这就是达到了整个系统的最优化。


从实践中,你会发现 ,最好的分派算法,粗粒度的算法选得好,性能会提高的倍数是最好的,越到细粒度越难调优,所以算法是关键。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics