[Info-vax] OpenMP Performance Problem

Richard B. Gilbert rgilbert88 at comcast.net
Sun Aug 30 09:13:30 EDT 2009


alex-lurk wrote:
> Dear all,
> I'm using OpenMP and have big performance problems.
> 
> I have a simple program written in Fortran with 4 parallel sectors.
> You find the important source code below.
> 
> I'm using Microsoft VisualStudio 2005 Professional Edition.
> The operating system is Microsoft Windows Server 2003, Standard x64
> Edition, Service Pack 2.
> It's running on an AMD Oteron with 4 CPUs.
> 
> In Microsoft VisualStudio 2005 I have set under "Configuration-
>> Fortran->Linker" the following settings:
> SubSystem: Console
> Heap Reserve Size: 256000000
> Heap Commit Size: 128000000
> Stack Reserve Size: 256000000
> Stack Commit Size: 128000000
> Enable Large Adresses: Support Adresses Larger Than 2 GB
> Terminal Server: Default
> 
> If I parallelize the 4 sectors like you can see below the calculation
> for all 4 sectors takes about 80 seconds.
> If I run it serial (without OpenMP) it is much quicker, in this case
> it only needs about 50 seconds.
> I don't understand this difference and I thought/hoped the parallel
> OpenMP version is much quicker, but it isn't :-(.
> Do you know why?
> Have I made something wrong?
> Or should I use another OpenMP Directive instead of "SECTIONS"?
> Or do you have experinces with another technologies instead of OpenMP
> for parallelizing Fortran programs?
> 
> Thanks a lot for your help!
> Many greetings,
> Alex
> 
> Soure code start: _____________________
> ...
> ...
> 
>      INTEGER N, I, J
>      PARAMETER (N=1000000)
>      REAL A1(N), A2(N), A3(N)
>      REAL B1(N), B2(N), B3(N)
>      REAL C1(N), C2(N), C3(N)
>      REAL D1(N), D2(N), D3(N)
>      REAL parallel_time_begin, parallel_time_end
>      REAL section1_time_begin, section1_time_end
>      REAL section2_time_begin, section2_time_end
>      REAL section3_time_begin, section3_time_end
>      REAL section4_time_begin, section4_time_end
> 
> ...
> ...
> 
> !     Some initializations
> 
>      DO I = 1, N
>        A1(I) = I + 1.5
>        A2(I) = I + 22.35
>        B1(I) = I + 1.5
>        B2(I) = I + 22.35
>        C1(I) = I + 1.5
>        C2(I) = I + 22.35
>        D1(I) = I + 1.5
>        D2(I) = I + 22.35
>      ENDDO
> 
> ...
> ...
> 
>      PRINT *, '***** parallel dcal start *****'
>      CALL CPU_TIME ( parallel_time_begin )
> 
> C$OMP PARALLEL PRIVATE(A1, A2, A3,
>     1B1, B2, B3,
>     2C1, C2, C3,
>     3D1, D2, D3,
>     4I, J)
> C$OMP SECTIONS
> 
> C$OMP SECTION
>      PRINT *, '***** 1. Section Start'
>      CALL CPU_TIME ( section1_time_begin )
>      DO J = 1, 1000
>        DO I = 1, N
>          A3(I) = A1(I) + A2(I)
>        ENDDO
>      ENDDO
>      CALL CPU_TIME ( section1_time_end )
>      PRINT *, '====> time of section1 was              ',
>     1section1_time_end - section1_time_begin, ' seconds <===='
>      PRINT *, '***** 1. Section End'
> 
> C$OMP SECTION
>      PRINT *, '***** 2. Section Start'
>      CALL CPU_TIME ( section2_time_begin )
>      DO J = 1, 2000
>        DO I = 1, N
>          B3(I) = B1(I) + B2(I)
>        ENDDO
>      ENDDO
>      CALL CPU_TIME ( section2_time_end )
>      PRINT *, '====> time of section2 was              ',
>     1section2_time_end - section2_time_begin, ' seconds <===='
>      PRINT *, '***** 2. Section End'
> 
> C$OMP SECTION
>      PRINT *, '***** 3. Section Start'
>      CALL CPU_TIME ( section3_time_begin )
>      DO J = 1, 3000
>        DO I = 1, N
>          C3(I) = C1(I) + C2(I)
>        ENDDO
>      ENDDO
>      CALL CPU_TIME ( section3_time_end )
>      PRINT *, '====> time of section3 was              ',
>     1section3_time_end - section3_time_begin, ' seconds <===='
>      PRINT *, '***** 3. Section End'
> 
> C$OMP SECTION
>      PRINT *, '***** 4. Section Start'
>      CALL CPU_TIME ( section4_time_begin )
>      DO J = 1, 4000
>        DO I = 1, N
>          D3(I) = D1(I) + D2(I)
>        ENDDO
>      ENDDO
>      CALL CPU_TIME ( section4_time_end )
>      PRINT *, '====> time of section4 was              ',
>     1section4_time_end - section4_time_begin, ' seconds <===='
>      PRINT *, '***** 4. Section End'
> 
> C$OMP END SECTIONS NOWAIT
> C$OMP END PARALLEL
> 
> ...
> ...
> 
> Source code end: _____________________

Why are you posting to comp.os.vms???   AFAIK OpenVMS has no connection 
whatever with Microsoft.



More information about the Info-vax mailing list