找回密码
 注册
Simdroid-非首页
查看: 605|回复: 13

并行编程——简介

[复制链接]
发表于 2007-5-14 17:06:10 | 显示全部楼层 |阅读模式 来自 上海
处理器由单核向多核的转变给程序员带来了前所未有的挑战。
所幸的是高性能计算编程所受的冲击最小——这个领域里并行本来就是必然。

编写并行程序,有两个大的实现途径:共享存储和消息传递。当前前者的主要实现
方式有OpenMP编程和多线程编程;后者的主要实现方式是MPI编程。

MPI是一套用于在进程间传递信息的API,支持C、C++和Fortran,具有良好的可移植性。
当前流行的大部分并行数值计算程序均采用MPI进行开发。作为一个函数库,MPI本身并
不难掌握,真正的困难一是在于对并行的理解,即如何设计并行的算法;另外是如何取得
好的并行性能。清华大学都志辉的《MPI并行程序设计》可作为入门读物。想要进阶,则
需要去读一些并行算法方面的书,如中科大陈国良院士的书或者中科院网络中心迟学斌等
人的讲义。当然,无论使用什么工具开发,并行算法都是进阶的必经之路。

OpenMP是一个共享存储方式的并行编程标准,它采用“制导语句”的方式实现,即在原有的
串行程序中插入一些指导并行的语句,当编译器支持OpenMP时,编译得到并行程序,当编译器
不支持OpenMP时,这些语句并视为注释语句,得到原有的串行程序。因此,OpenMP非常适合
将原有的串行程序改造为并行程序。当前GCC、Intel、PGI、MS VS.net等主流编译工具均提供
对OpenMP的支持。OpenMP的缺点一是只适用于硬件共享存储的机器,如多核芯片、多处理器节点等,
而不能跨节点进行,因此,程序可扩展性受硬件影响;二是实现和调试均有较大不足,没有一定的经验,
很难发现一些代码错误;三是作为介于手动并行和自动并行之间的半自动并行,对许多应用难有好的并行性能。
OpenMP的参考资料包括SUN的“OpenMP API User's Guide”,还有OpenMP ARB的“OpenMP Application Program Interface”,
有本译成中心的讲MPI和OpenMP编程的书,名字记不清了。

OpenMP也是通过多线程实现并行,但通常所说的多线程编程是指用WinThread或pthread进行显式的并行
编程,这类方法的主要问题有:
1、自己手动控制对共享数据的处理,如加锁等,程序复杂以后太容易出错,而且调试困难;
2、适合任务并行(如flashget等下载工具多线程下载),而不是科学计算中大量存在的数据并行。
3、实现不具可移植性,如Window和Linux系统下没有一致的多线程环境(Java除外);
4、与OpenMP一样,不能跨节点运行,带来的可扩展性问题。
显式的多线程编程在高性能计算领域很少使用。

上面大致介绍了并行编程相关的内容,如果你正着手开发并行程序,我的具体建议为:
1、希望现有程序性能提升多少倍?可能的运行平台是什么,会有多少个核提供?如果单节点无法达成目标,
      而且计算规模一直会有增长,那么选用MPI进行开发。反之,如果对性能提升的倍数要求不高,如10倍以内,
      那考虑多核处理器的发展,一台4路4核的机器就可以基本满足要求,则宜选用OpenMP进行开发。
2、对程序性能、可扩展性等要求都比较高(问题算得大,需要算得快),则可以采用OpenMP+MPI混合编程,
      在多节点、单节点多处理器多核的机群系统上能获得最好的并行效果;
3、充分利用各种并行数学库,如MKL、ACML、FFTW、ATLAS等,通常会事半功倍。

最后想说的是,软件的发展总是滞后于硬件。在软件开发方面,完全还没作好迎接多核时代的准备,无论是
编译器、调试器、函数库,还是编程模式、编程方式等。对高性能计算,由于一直做并行,这个问题还不是
那么迫切,对更广大的IT领域的程序员而言,如何面对多核处理器,这是一个问题。


作者:SSC
发表于 2007-5-14 21:21:44 | 显示全部楼层 来自 上海浦东新区
Simdroid开发平台
好文,令人茅塞顿开。顶~~~
回复 不支持

使用道具 举报

发表于 2007-5-15 21:09:40 | 显示全部楼层 来自 湖北武汉
有没有办法让现有的程序(不再进行修改)变成并行的啊?
回复 不支持

使用道具 举报

发表于 2007-5-16 09:54:57 | 显示全部楼层 来自 上海

回复 #3 microchiper 的帖子

不修改任何代码实现并行,这是人们很久以来的愿望,相关研究在七八十年代最火,
即通过编译器实现自动并行化,但很遗憾,在八九十年代这已经被大多数人认为是
死胡同一条,相关研究目前基本处于停滞状态。

因此,现有的代码不经任何修改就能并行,现在没有办法,可行的办法有:
1、在核心的计算部分调用并行数学库,只需修改少量代码即可实现高效并行;
2、使用OpenMP,但需要一段时间的学习和摸索;
3、雇人、找人并行化,自己不需要修改代码,实现并行。(权或钱有吗,呵呵)
回复 不支持

使用道具 举报

 楼主| 发表于 2007-5-16 09:59:45 | 显示全部楼层 来自 上海

回复 #3 microchiper 的帖子

不行,只能在原有程序基础上进行并行化改造。
回复 不支持

使用道具 举报

发表于 2007-7-30 00:26:12 | 显示全部楼层 来自 日本
以前的串行程序,可以使用支持OpenMP的编译器,在添加自动并行优化的编译选项后,重新进行编译,就可以在支持超线程或多核的CPU上实现并行化。但是由于是编译器自动并行处理的,因此比起手工使用OpenMP指令进行并行化的效率要底。

[ 本帖最后由 frozenfire 于 2007-7-30 00:27 编辑 ]
回复 不支持

使用道具 举报

发表于 2007-7-30 00:38:25 | 显示全部楼层 来自 日本
另,OpenMP应该已经成为SMP上进行并行的最优并行手段,而且标准已经发展到v2.5了,很多厂商都开始支持,所以说可移植性差,不知是指哪方面?
现在随着SMP的广泛使用(包括多核技术的不断成熟),混合编程技术在并行编程时显得越来越重要了,因此值得大家研究。
回复 不支持

使用道具 举报

发表于 2007-8-3 16:49:09 | 显示全部楼层 来自 上海
学习学习~
回复 不支持

使用道具 举报

发表于 2007-8-7 20:06:11 | 显示全部楼层 来自 西安交通大学

^_^

同意同意! 好好研究研究 ^_^
回复 不支持

使用道具 举报

发表于 2007-9-22 16:01:01 | 显示全部楼层 来自 湖南长沙
好好研究研究 ^_^
回复 不支持

使用道具 举报

发表于 2007-11-30 18:46:18 | 显示全部楼层 来自 陕西西安
谢谢 介绍  知道了不少东西
回复 不支持

使用道具 举报

发表于 2007-12-8 18:25:36 | 显示全部楼层 来自 湖北宜昌
谢谢介绍,好好研究
回复 不支持

使用道具 举报

发表于 2008-3-6 22:11:28 | 显示全部楼层 来自 天津
现在不是有star-p了么?
回复 不支持

使用道具 举报

发表于 2008-3-8 13:20:27 | 显示全部楼层 来自 浙江杭州
那么高手们能不能提供些 OpenMP编程 方面的资料以供大家学习
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-19 21:43 , Processed in 0.045008 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表