计算化学公社

标题: fortran调用子程序的并行调用问题求解答 [打印本页]

作者
Author:
didi_dudu    时间: 2019-8-2 10:34
标题: fortran调用子程序的并行调用问题求解答
请教一下论坛各位大佬
fortran中调用子程序能不能实现并行调用呢?
比如我有一段代码
do i = 1, 100
call program1
call program2
enddo

call program3

program1和program2都是独立的子程序,各自运算不同的东西。然后我想要program1和program2同时执行,然后都执行完之后再执行program3.有没有什么操作方式?
想用这种方式来实现数据的存储和运算的并行执行。program1是用来读取数据,program2是用来计算上一步program1读取的数据。



作者
Author:
万里云    时间: 2019-8-2 11:49
rogram1是用来读取数据,program2是用来计算上一步program1读取的数据。


这个没法并行。不读完数据怎么处理?
作者
Author:
niobium    时间: 2019-8-2 12:54
你又说两个程序是独立的,又说2需要1的数据。

像你说的想同时运行1和2,有一个简单的判断方法,如果先1后2和先2后1结果相同,那就可能可以并行,否则不能并行。
作者
Author:
didi_dudu    时间: 2019-8-2 15:22
niobium 发表于 2019-8-2 12:54
你又说两个程序是独立的,又说2需要1的数据。

像你说的想同时运行1和2,有一个简单的判断方法,如果先1 ...

我说的是2需要的是上一轮1读取的数据。呃我可以换一个问题,就是两个子程序program1和program2完全独立,那能不能在fortran中让1和2并行呢?
因为我有两个程序,1个是从硬盘读取数据A,对cpu要求不高,2是对内存里已经有的数据B做运算。1和2并行是不是效率就会高一点?
作者
Author:
didi_dudu    时间: 2019-8-2 15:24
万里云 发表于 2019-8-2 11:49
这个没法并行。不读完数据怎么处理?

有个do循环嘛,比如运行到第n轮的时候,第n轮的program2会用到第n-1轮的program1从硬盘读取进内存的数据
作者
Author:
niobium    时间: 2019-8-2 15:46
didi_dudu 发表于 2019-8-2 15:22
我说的是2需要的是上一轮1读取的数据。呃我可以换一个问题,就是两个子程序program1和program2完全独立, ...

可以,最简单的方式就是用openmp的sections
作者
Author:
sobereva    时间: 2019-8-3 00:28
#pragma omp sections
{
{ Work1(); }
#pragma omp section
{ Work2();
Work3(); }
#pragma omp section
{ Work4(); }
}


This code indicates that any of the tasks Work1, Work2 + Work3 and Work4 may
run in parallel, but that Work2 and Work3 must be run in sequence. Each work
is done exactly once.
作者
Author:
didi_dudu    时间: 2019-8-9 16:18
本帖最后由 didi_dudu 于 2019-8-10 10:47 编辑
sobereva 发表于 2019-8-3 00:28
This code indicates that any of the tasks Work1, Work2 + Work3 and Work4 may
run in parallel, b ...

发现问题出在我没在程序最前面加上      include 'omp_lib.h'。 用ifort编译时,不加是没问题的,用pgf90, 不加include,跑sections就不行了。但是omp parallel do 还是可以执行。。。。
============================
!$omp sections
!$omp section
                do i = 1, 200
                  write(6,*)'i', i
                enddo
!$omp section
                do j = 1, 200
                  write(6,*)'j', j
                enddo
!$omp end sections
社长,我用fortran尝试这样写了一段,我理解的这样输出来应该是i和j混合排列的,然而实际输出来的结果还是先打完i再打的j,能不能帮我看看这段代码有什么问题,谢谢!


作者
Author:
didi_dudu    时间: 2019-12-10 16:35
sobereva 发表于 2019-8-3 00:28
This code indicates that any of the tasks Work1, Work2 + Work3 and Work4 may
run in parallel, b ...

社长请问一下,我想实现以下功能, 让test1和test2用section并行起来,然后同时让test1和test2内部也可以进行多核并行。section里面有什么相关设置可以实现这种功能么?我目前这种代码结构上,发现test1和test2内部的子程序,即使是利用了openmp parallel do,也只能单核运算了。
====================
!$omp parallel sections
!$omp section
call test1
!$omp section
call test2
!$omp end parallel sections





欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3