回 帖 发 新 帖 刷新版面

主题:fortran77写的程序如何采用Openmp并行?

在这个帖子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系统下测试的



回复列表 (共13个回复)

沙发

!$  call omp_set_num_threads(8)
改成:
call omp_set_num_threads(8)

这个是语句,不是宏:)

板凳

好像还不行,修改前和修改后结果好像一样。

编译: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 楼

fixed 跟free的格式不同, 到时omp在这两种格式下要求也不同. fixed要求"!$OMP", "!$"要写在指定位置的.

4 楼

你后来改得f77跟2楼贴得结果.
旧帖只是贴了一代码的一部分, 不过如果补充完整, 那些变量的声明最好都加上去. 让fotran自己采用默认有点风险, 除非你很清楚默认规则.

5 楼

多谢指点,我试一下!

6 楼

加上变量声明好像也不行。

0.0000000
0
4
18
48
100
180
294
448
648
900

7 楼

看不懂你输出的结果. 为什么有个浮点数的0.00000?
write(*,*) threads 这个语句究竟对应输出的是那一个?

8 楼

我怎么记得F77里的OpenMP
必须严格按照传统注释写C开头呢?
许久不用,也可能记错了

9 楼

翻了一下<using openmp -- portable shared memory parallel programming> P36 在fixed下
!$OMP
C$OMP
*$OMP
都可以. gfortran应该也支持吧. fixed格式我基本不用,偶尔看看而已. 自己写的代码重来不用fixed.

10 楼

      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的输出,

我来回复

您尚未登录,请登录后再回复。点此登录或注册