【问题标题】:Fortran OpenMP program shows no speedup of CPU_TIME()Fortran OpenMP 程序显示 CPU_TIME() 没有加速
【发布时间】:2014-08-23 18:31:00
【问题描述】:

并行性的使用应该可以最大限度地减少程序的时间,但这并没有发生在我身上。当我使用 OpenMP 并行编写代码时,运行时间会增加,即并行时间 > 串行时间。

我的代码:

    PROGRAM MAIN
    use omp_lib
    implicit none
    REAL*8 Times1,Times2
    INTEGER I,J
    real, allocatable, dimension(:) :: a
    allocate(a(1000))
    DO J = 1, 1000
    a(j)=j  
    ENDDO
!    ***************NO PARALLEL CODE ************************************
    call CPU_TIME(Times1)
    write(*,*) 'CPU NO PARALLEL STARTED:',Times1
    DO I = 1, 1000
    DO J = 1, 500000
    a(I)=a(I)+0.0001
    end do 
    a(I)=a(I)+a(I)+a(I)
    ENDDO
    call CPU_TIME(Times2)
    write(*,*) 'CPU CPU NO PARALLEL finished:',Times2
    write(*,*) 'NO PARALLEL TIMES:',Times2-Times1
    write(*,*) '---------------------------------------------------'
!    ***************PARALLEL CODE ************************************
    call CPU_TIME(Times1)
    write(*,*) 'CPU PARALLEL STARTED:',Times1
!$OMP PARALLEL DEFAULT(shared), private(I,J)
!$OMP DO
    DO I = 1, 1000
    DO J = 1, 500000
    a(I)=a(I)+0.0001
    end do 
    a(I)=a(I)+a(I)+a(I)
    ENDDO
!$OMP END DO
!$OMP END PARALLEL
    call CPU_TIME(Times2)
    write(*,*) 'CPU PARALLEL finished:',Times2
    write(*,*) 'PARALLEL TIMES:',Times2-Times1
    deallocate(a)
    STOP
    END

结果:

 CPU NO PARALLEL STARTED:  1.560010000000000E-002
 CPU CPU NO PARALLEL finished:   4.86723120000000
 NO PARALLEL TIMES:   4.85163110000000

 CPU PARALLEL STARTED:   4.86723120000000
 CPU PARALLEL finished:   9.89046340000000
 PARALLEL TIMES:   5.02323220000000

为什么使用 OpenMP 会增加 CPU_TIME() 测量的时间?

【问题讨论】:

    标签: fortran


    【解决方案1】:

    cpu_time() 占用 CPU 时间,而不是 walltime。在并行应用程序中,这些是不一样的。有关详细信息,请参阅here

    使用system_clock() 解决了这个问题:

        PROGRAM MAIN
        use omp_lib
        implicit none
        REAL*8 Times1,Times2
        INTEGER I,J, iTimes1,iTimes2, rate
        real, allocatable, dimension(:) :: a
        allocate(a(1000))
    
        CALL system_clock(count_rate=rate)
        DO J = 1, 1000
        a(j)=j  
        ENDDO
    !    ***************NO PARALLEL CODE ************************************
        call CPU_TIME(Times1)
        call SYSTEM_CLOCK(iTimes1)
        write(*,*) 'CPU NO PARALLEL STARTED:',Times1
        DO I = 1, 1000
        DO J = 1, 500000
        a(I)=a(I)+0.0001
        end do 
        a(I)=a(I)+a(I)+a(I)
        ENDDO
        call CPU_TIME(Times2)
        call SYSTEM_CLOCK(iTimes2)
        write(*,*) 'CPU CPU NO PARALLEL finished:',Times2
        write(*,*) 'NO PARALLEL TIMES:',Times2-Times1, real(iTimes2-iTimes1)/real(rate)
        write(*,*) '---------------------------------------------------'
    !    ***************PARALLEL CODE ************************************
        call CPU_TIME(Times1)
        call SYSTEM_CLOCK(iTimes1)
        write(*,*) 'CPU PARALLEL STARTED:',Times1
    !$OMP PARALLEL DEFAULT(shared), private(I,J)
    !$OMP DO
        DO I = 1, 1000
        DO J = 1, 500000
        a(I)=a(I)+0.0001
        end do 
        a(I)=a(I)+a(I)+a(I)
        ENDDO
    !$OMP END DO
    !$OMP END PARALLEL
        call CPU_TIME(Times2)
        call SYSTEM_CLOCK(iTimes2)
    
        write(*,*) 'CPU PARALLEL finished:',Times2
        write(*,*) 'PARALLEL TIMES:',Times2-Times1, real(iTimes2-iTimes1)/real(rate)
        deallocate(a)
        STOP
        END
    

    然后,你可以看到并行程序确实更快。

     CPU NO PARALLEL STARTED:   4.0000000000000001E-003
     CPU CPU NO PARALLEL finished:   1.4600000000000000     
     NO PARALLEL TIMES:   1.4560000000000000        1.45400000    
     ---------------------------------------------------
     CPU PARALLEL STARTED:   1.4600000000000000     
     CPU PARALLEL finished:   5.1040000000000001     
     PARALLEL TIMES:   3.6440000000000001       0.920000017  
    

    【讨论】:

      猜你喜欢
      • 2018-06-17
      • 2013-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 2012-11-13
      • 1970-01-01
      相关资源
      最近更新 更多