Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
114 views
in Technique[技术] by (71.8m points)

Fortran OpenMP program shows no speedup of CPU_TIME()

The use of parallelism should lead to minimizing the time of a program but this did not happened to me. When I programmed my code in parallel using OpenMP, the run time is augmented, i.e. PARALLEL TIME > SERIAL TIME.

My code:

    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

and the result :

 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

Why is my time measured by CPU_TIME() increased with OpenMP?

Question&Answers:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

cpu_time() takes the time on the CPU, not the walltime. In parallel applications these are not the same. See here for details.

Using system_clock() solves this problem:

    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

Then, you can see that the parallel program is indeed faster.

 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  

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...