回 帖 发 新 帖 刷新版面

主题:使用OPENMP并行后效率没有提高

最近想学OPENMP,编了下面一段代码试试,结果并行和串行用的时间是一样的。
在do循环中调用两次子程序A,在串行下每次子程序的运行时间是13.5s,总时间是27秒。
并行下每次子程序的运行时间也变成了27秒,总时间27秒。
求高手解答

       PROGRAM HELLO
       
       CALL CPU_TIME(T_START)
!$OMP PARALLEL DO PRIVATE(I,J,C)
        DO I = 1, 2
            CALL A(I,J,C)
        END DO
!$OMP END PARALLEL DO
 
      CALL CPU_TIME(T_END)
      WRITE(*,*) 'TIME IN MAIN IS ',T_END - T_START
      WRITE(*,*) 'C = ',C
       END




       SUBROUTINE A(I,J,C)
       
       CALL CPU_TIME(T_START)
          DO J = 1, 1000000000
            C =real(J) ** 0.3
          ENDDO
        CALL CPU_TIME(T_END)
      WRITE(*,*) 'TIME IN',I,'IS', T_END - T_START
      RETURN
      END

回复列表 (共4个回复)

沙发

cpu_time多核的时间显示的是多个核心的总时间

板凳

刚接触openmp的朋友可能不是很清楚, cpu_time算出来的时间是cpu占用时间. 每个核心的平均时间是那个数值除以核心数目. 不过建议用system_clock函数.

3 楼

[quote]刚接触openmp的朋友可能不是很清楚, cpu_time算出来的时间是cpu占用时间. 每个核心的平均时间是那个数值除以核心数目. 不过建议用system_clock函数.[/quote]

system_clock输出的时间单位不知道是什么
我后来用SECNDS函数结果对了,单位是秒

    real *8 s
    s = secnds(0.0)
    …
    block
    …
    s = secnds(s)

4 楼

SECNDS函数好像不是内部函数, 虽然查cvf的时候有这个.
system_clock肯定内部的, 至于它的变量可以查查内部函数的资料.

我来回复

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