主题:fortran77写的程序如何采用Openmp并行?
ch06
[专家分:30] 发布于 2011-10-19 10:27:00
在这个帖子http://bbs.pfan.cn/post-368849.html
里看到f90程序并行方法,试了下,可以达到目的
!$ call omp_set_num_threads(8)
!$OMP PARALLEL DEFAULT(PRIVATE)
threads = omp_get_num_threads()
print *,threads
!$OMP DO
do i=1,10
myTest = i*i*i-i*i
end do
!$OMP END DO
!$OMP END PARALLEL
改成fortran77格式,好像不好使了
progranm main
!$ call omp_set_num_threads(8)
!$OMP PARALLEL DEFAULT(PRIVATE)
threads = omp_get_num_threads()
write(*,*) threads
!$OMP DO
do i=1,10
myTest = i*i*i-i*i
end do
!$OMP END DO
!$OMP END PARALLEL
end
我又改造了一个fortran77程序,这个好像可以
progranm main
!$omp parallel
!$omp critical
do i=1, 10000000
write(*,*) i, "hello word"
enddo
!$omp end critical
!$omp end parallel
end
编译:gfortran -fopenmp hello.f -o hellof
执行:OMP_NUM_THREADS=2 ./hellof
可以看到有两个进程,为什么第一个改的程序还是一个进程在跑呢?
注:我是在ubuntu系统下测试的
最后更新于:2011-10-19 10:29:00
回复列表 (共13个回复)
沙发
cgl_lgs [专家分:21040] 发布于 2011-10-19 10:44:00
!$ call omp_set_num_threads(8)
改成:
call omp_set_num_threads(8)
这个是语句,不是宏:)
板凳
ch06 [专家分:30] 发布于 2011-10-19 15:05:00
好像还不行,修改前和修改后结果好像一样。
编译:gfortran -fopenmp hello.f -o hellof
执行:./hellof
输出结果:
0.0000000
0
4
18
48
100
180
294
448
648
900
我运行那个f90程序时,输出结果
0.0000000
0
4
18
0.0000000
900
0.0000000
294
448
648
0.0000000
48
100
180
3 楼
yeg001 [专家分:14390] 发布于 2011-10-19 16:52:00
fixed 跟free的格式不同, 到时omp在这两种格式下要求也不同. fixed要求"!$OMP", "!$"要写在指定位置的.
4 楼
yeg001 [专家分:14390] 发布于 2011-10-19 18:23:00
你后来改得f77跟2楼贴得结果.
旧帖只是贴了一代码的一部分, 不过如果补充完整, 那些变量的声明最好都加上去. 让fotran自己采用默认有点风险, 除非你很清楚默认规则.
5 楼
ch06 [专家分:30] 发布于 2011-10-19 20:37:00
多谢指点,我试一下!
6 楼
ch06 [专家分:30] 发布于 2011-10-20 11:29:00
加上变量声明好像也不行。
0.0000000
0
4
18
48
100
180
294
448
648
900
7 楼
yeg001 [专家分:14390] 发布于 2011-10-20 11:47:00
看不懂你输出的结果. 为什么有个浮点数的0.00000?
write(*,*) threads 这个语句究竟对应输出的是那一个?
8 楼
dongyuanxun [专家分:7180] 发布于 2011-10-20 12:35:00
我怎么记得F77里的OpenMP
必须严格按照传统注释写C开头呢?
许久不用,也可能记错了
9 楼
yeg001 [专家分:14390] 发布于 2011-10-20 13:09:00
翻了一下<using openmp -- portable shared memory parallel programming> P36 在fixed下
!$OMP
C$OMP
*$OMP
都可以. gfortran应该也支持吧. fixed格式我基本不用,偶尔看看而已. 自己写的代码重来不用fixed.
10 楼
ch06 [专家分:30] 发布于 2011-10-20 14:13:00
progranm main
integer i,myTest
real threads
!$ call omp_set_num_threads(4)
!$OMP PARALLEL DEFAULT(PRIVATE)
threads = omp_get_num_threads()
write(*,*) threads
!$OMP DO
do i=1,10
myTest = i*i*i-i*i
write(*,*) myTest
end do
!$OMP END DO
!$OMP END PARALLEL
end
谢谢各位大侠的关注,我现在运行的是上面的代码
输出结果为:
0.0000000
0
4
18
48
100
180
294
448
648
900
0.00000应该是threads的输出,
我来回复