今天听了一个博士师兄的论文答辩,试图提高分布式存储并行和共享存储并行中,循环中并行粒度。
分布式存储下的并行,可以简单的理解为片间的并行,集群,很多CPU的计算机中的并行都属于这一类,这类并行强调的是消息传递,因为每个计算单元都有自己的存储空间,且这些存储是相互独立的,靠消息传递的方式来维护存储一致性,这类程序通常使用MPI工具做并行程序开发。这种并行一般是进程之间的并行,每个进程都有独立的资源管理和消息收发,地址空间相互独立。
共享存储下的并行则不同,采用线程间的并行策略,即并行任务之间采用共享存储空间的形式,存储和资源都是共享的。这类并行多存在于现在流行的多核和众核系统中。主要面临的问题是一致性,缓存一致性是最主要的,因为多核系统通常是每个单核有一级cache,而多个核之间又共享二级或者三级cache,据说CPU上30%多的功耗都用在了维持一致性上。片上面积也一半多用来做了cache。OPENMP就是为共享存储而生的编程工具。
说到这里不得不提一下CUDA。CUDA现在可谓炙手可热。其实就是将CPU和GPU一起用,CPU有很强的控制逻辑设计,能够跑操作系统,而GPU则着眼于流计算,强调运算能力,不能跑操作系统,却拥有强大的运算能力,CUDA就设计了编程模型,实现二者的合理利用,其实也是共享存储的形式。CPU有主存,显卡有显存,通过类似于memcpy的函数实现主存和显存之间的数据拷贝,然后在显存上启动kenel函数完成计算。之后再将显存中到数据拷回主存。
工业界的并行程序开发其实很多都基于MPI来做的,因为OpenMP太难实现,难就难在调试上,共享存储的方式,很难确定特定的存储是哪个函数,怎么修改得到的,调试相当困难,且错误并不是总出现。而MPI则能很容易确定消息传递的情况,debug就简单了很多。其实很多时候,并行机的程序员都倾向于使用更简单的同步消息传递而非异步。这样得到的代码才能简单明了。
并行计算确实是很令人期待的,但是通往并行计算的道路太不明朗。未来的路还很长.一提到并行,仿佛所有搞计算机的人都在发愁。这正是黎明前最黑暗的时刻!可以参考本博关于加州大学伯克利分校的<并行计算前景>系列翻译文章,这系列文章还没有完全翻译结束,但是已经翻译的内容绝对精彩:)

好,多谢,呵呵。
@小丁, 不客气 欢迎常来看看:)
很想听听你师兄答辩都说了什么,分布式存储循环级别的并行是怎么提高的。我在做自动并行化,觉得你前面的博文说的很对,’自动并行化已经没有前途了,指令级并行已经快到极限了,所以关键是和应用相结合的并行化’。
如何结合就是目前最头疼的问题,既然循环已经没得发掘了,只能粒度更粗。头疼的就是如何粒度更粗
@小丁, 我觉得伯克利的方法还有很多可取的地方,详细的内容你可以先看看上面推荐文章中的几篇,都有提到。如果你想细致了解的话,推荐看看伯克利的论文,我在《并行计算前景-译者注》中有提到如何下载原文。自动并行化基本没戏。每个人都觉得如果能做到会多好,但事实证明没希望。。。。。。
“据说CPU上30%多的功耗都用在了维持一致性上。片上面积也一半多用来做了cache。” 看来SMP的代价也很高啊,尤其是现在强调节能。
@donghao, 恩 功耗确实很惊人,所以Intel最近做出的48核的众核处理器作为科研用产品,并没有加入cache一致性机制,试图通过软件的方式来维持。