fortran如何实现并行计算?

fortran如何实现并行计算?,第1张

实现并行的方式有很多种

从硬件上分为 CPU 并行和GPU 并行

CPU 并行目前主要有:

1. 进程级适用于分布内存的MPI 并行(参考书 百度 都志辉)

2. 线程级别的openmp (参考书:百度 fortran openmp)

需要注意的是 MPI 相对底层一点,openmp 则非常简单 基本上1个月能够将你的程序并行化。 但前者的效率要高于后者 当然我是说你程序编写合理的情况下。

GPU 并行:

目前的配芦猛显卡基本上都支持GPU并行,只要你的显卡不是很老,都可以用来做GPU 并行计算。 GPU计算说通俗一点就是借助显卡的处理核心来做科学计算,有效发挥显卡的多核计算能力

如果你要进行GPU 编程,那么建议学习CUDA 对应于C 有cuda C 对应于fortran 有cuda fortran 当然 目前cuda fortran 的编译器只有pgi, 你可以很方便在网上下载到试用版本。

就这么多吧,仅供参考。有什么问题可以在群里 或者在论坛里面提问,大家来讨论。

最后还补充一下,如果你有正版PGI的话,也可以用openacc 也是一种简化的cuda 大体上就是你在代码中哗改加入一些编译指导语句培桥,然后编译器帮你把代码cuda 并行化。相当于cpu 并行里的openmp。

在Linux下运行作业时, 经常会遇到以下情形: 有大量作业需要运行, 完成每个作业所需要的时间也不是很长. 如果我们以串行方式来运行这些作业, 可能要耗费较长的时间若采用并行方式运行则可以大大节约运行时间. 再者, 目前的计算机绝大部分都是多核架构, 要想充分发挥它们的计算能力也需要并行化. 总结网上看到的资料, 利用Bash脚本, 可以采用下面几种方法实现批量作业的并行化. 注意, 下面论述中将不会区分进程和线程, 也不会区分并行和并发.

1. 采用GNU的paralle程序

parallel是GNU专门用于并行化的一个程序, 对于简单的批量作业并行化非常合适. 使用parallel不需要编写脚本, 只需在原命令的基础上简单地加上parallel就可以了. 所以, 如果能用paralle并行化你的作业, 请优先使用. 有关paralle的详细说明, 请参考其官方文档.

2. 最简单的并行化方法:&+wait

利用Bash的后台运行&和wait函数, 可实现最简单的批量作业并行化.

如下面的代码, 串行执行大约需要10秒

改为下面的简单并行代码理想情况下可将运行时间压缩到3秒左右

3. 进程数可控的并行化方法(1): 模拟队列

使用Bash脚本同时运行多个进程并无困难, 主要存在的乎键问题是如何控制同时运行的进程数目. 上面的简单并行化方法使用时进程数无法控制, 因而功能有限, 因为大多数时候我们需要运行的作业数远远超过可用处理器数, 这种情况下若大量作业贺凳同时在后台运行, 会导致运行速度变慢, 并行效率大大下降. 一种简单的解决方案就是模拟一个限定最大进程数的队列, 以进程PID做为队列元素, 每隔一定时间检查队列, 若队列中有作业完成, 则添加新的作业到队列中. 这种方法还可以避免由于不同作业耗时不同而产生的无用等待. 下面是根据网上的代码改写的一种实现. 实用性更强的代码, 请参考原文.

一个更简洁的方法是记录PID到数组, 通过检查PID存在与否以确定作业是否运行完毕. 可实现如下

3. 进程数可控岁拍巧的并行化方法(2): 命名管道

上面的并行化方法也可利用命名管道来实现, 命名管道是Linux下进程间进行通讯的一种方法, 也称为先入先出(fifo,first in first out)文件. 具体方法是创建一个fifo文件, 作为进程池, 里面存放一定数目的"令牌".作业运行规则如下: 所有作业排队依次领取令牌每个作业运行前从进程池中领取一块令牌, 完成后再归还令牌当进程池中没有令牌时, 要运行的作业只能等待. 这样就能保证同时运行的作业数等于令牌数. 前面的模拟队列方法实际就是以PID作为令牌的实现.

据我已查看的资料, 这种方法在网络上讨论最多. 实现也很简洁, 但理解其代码需要的Linux知识较多. 下面是我改写的示例代码及其注释.

注意:

(1) exec6<>$Pfifo 这一句很重要, 若无此语句, 向$Pfifo写入数据时, 程序会被阻塞, 直到有read读出了文件中的数据为止. 而执行了此语句, 就可以在程序运行期间不断向文件写入数据而不会阻塞, 并且数据会被保存下来以供read读出.

(2) 当$Pfifo中已经没有数据时,read无法读到数据, 进程会被阻塞在read *** 作上, 直到有子进程运行结束,向$Pfifo写入一行.

(3) 核心执行部分也可使用如下方式

{}和()的区别在shell是否会衍生子进程

(4) 此方法在目前的Cygwin(版本1.7.27)下无法使用, 因其不支持双向命名管道. 有人提到一个解决方案, 使用两个文件描述符来替代单个文件描述符, 但此方法我没有测试成功.

“大数据”视角,并非近年来的新事物,回顾历史,早已有之。只是当时,“大数据”这个词,尚未产生。

19世纪,“量化”之于航海。 19世纪还是航海经验靠口口相传、有些甚至被证明是错误的年代,航海家莫里通过量化分析制作的导航图,是大数据的最早实践之一。在因为马车事故造成腿部残疾后,年轻的海军军官莫里离开了海上工作,来到了图表和仪器厂。在这个后来被证明是他福地的地方,在翻阅、整理库房里存放的航海书籍、地图、图表、航海日志后,莫里将这些记录进行数据整合,把整个大西洋按经纬度分成五块,并按月份标出温度、风速和风向,为找到更有效的航海路线提供参考。之后,为了提高精确度,莫里创建了一个标准的表派燃余格来记录航海数据,并在所有海军舰艇及部分商船上使用,通过分析这些数据,一些利于航行的天然航线被找到,为海军及商船减少了三分之一的航海路程。远在信息数字化之前,人工的数据运用已经充分展示了其实效。随着数据存储和处理能力的不断提高,“段肢大数据”技术的运用领域也不断扩展。

20世纪,“量化”之于投资。 在金融领域,“量化”这个词经常以“量化投资”等词组形式出现,指的是通过数量化方式及计算机程序化发出买卖指令,以获取稳定收益为目的的交易方式,其实质在于替代传统的定性分析,以数据为支撑作出投资决策。“量化投资”在海外的发展已有30多年的历史,其投资业绩稳定,市场规模和份额不断扩大,得到了越来越多投资者认可。金融领域是数据相对集中和易感知的领域,但量化的舞台,远不止于此。

21世纪,“量化”之于坐姿研究。 日本先进工业技术研究所的越水重臣教授将量化用于坐姿研究,通过对人坐着时的身形、姿势和重量分布等的数据化,产生独属于每个乘坐者的精确数据资料,并根据人体对座位的压力差异识别出乘坐者身份,准确率达到98%。这项技术可作为汽车防盗系统,通过这个系统,汽车可以识别驾驶者是否为车主并设置相应安全措施。数据的提取,只有你想不到,没有提取不到,关键在于如何提取、如何利用。

数据化,不是数字化。 前者,是指把现象转变为可制表分析的量化形式的过程;后者,指的是把模拟数据转换成用0和1表示的二进制码。在数字化时代来临之时,在脑海中对这两个概念有清晰概念十分重要。数据化的关注重点是在“I(信息)”上,而数字化则关注“T(技术)”。数字化的发展,提高了数据化的可行性。

“数据化”文字。 谷歌的数字图书馆,是文字数据化的典范。通过文字的数据化,人可以用之阅读,机器也可以用之分析。谷歌运用这些数据化了的文本来改进它的机器翻译服务,从几年前相当于高中水平的翻译水准,到如今的令人惊叹,着实超越了英语水平不断退化的某笔者(容某笔者先找个地儿蹲着哭一会儿)。

“数据化”方位。 手机的广泛运用,让人的实时位置信息也可以被数据化,位置信息的数据化,催生了尘滚许多新价值。比如无线数据科技公司Jana的创始人伊格尔,他使用了来100多个国家的超过200个无线运营商的手机数据,既关注家庭主妇平均每周去几次洗衣店,也试图回答关于疾病如何传播等问题。新的用途不断产生,既可以用于商业,也可以用于社会研究。

“数据化”沟通。 个人化是数据化的前沿,facebook将关系数据化,twitter将情绪数据化,linkedin将个人经历数据化,这些社交网络平台,以各种方式将个人及其沟通数据化,并存储了海量的用户数据。初步的运用,例如Derwent Capital对冲基金对微博数据文本的分析,获得了股市投资的信号,虽然由于隐私问题,数据的使用还远未成熟,但我们不难想象,当数据被充分运用,世间万物是否已不再是世间万物,而是海量的数据呢?

当看到一切皆可量化这句话,还是持一定的保留态度。因为,太过绝对。但似乎,这只是一种理念的传递,为了表达数据化的重要性而已。大数据视角,提供了看世界的另外一个角度,但绝不是唯一视角。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8280028.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-15
下一篇2023-04-15

发表评论

登录后才能评论

评论列表(0条)

    保存