OPEN - MPI例子

更新时间:2024-02-26 22:41:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

例子1:

(1)!$OMP DO SCHEDULE PROGRAM VEC_ADD_DO

INTEGER N, CHUNKSIZE, CHUNK, I PARAMETER (N=1000)

PARAMETER (CHUNKSIZE=100) REAL A(N), B(N), C(N) ! Some initializations DO I = 1, N A(I) = I * 1.0 B(I) = A(I) ENDDO

CHUNK = CHUNKSIZE

!$OMP PARALLEL SHARED(A,B,C,CHUNK) PRIVATE(I)

!$OMP DO SCHEDULE(DYNAMIC,CHUNK) DO I = 1, N

C(I) = A(I) + B(I) ENDDO

!$OMP END DO NOWAIT

!$OMP END PARALLEL WRITE(*,*) (C(I),I=1,N)

END

(2)!$OMP DO SCHEDULE program main

implicit none

integer i,N,CHUNKSIZE,CHUNK

PARAMETER (N=9)

PARAMETER (CHUNKSIZE=4) REAL a(N)

CHUNK = CHUNKSIZE a(1)=100

!$OMP PARALLEL SHARED(a) PRIVATE(I)

!$OMP DO SCHEDULE(DYNAMIC,CHUNK)

do i = 1, 8

a(i+1) = a(1) + i enddo

!$OMP END DO NOWAIT

!$OMP END PARALLEL

write(*,*) (a(i),i=1,8) end

例子2:主要熟悉SECTION的用法

PROGRAM VEC_ADD_SECTIONS INTEGER N, I

PARAMETER (N=1000)

REAL A(N), B(N), C(N), D(N) ! Some initializations DO I = 1, N A(I) = I * 1.5 B(I) = I + 22.35 ENDDO

!$OMP PARALLEL SHARED(A,B,C,D), PRIVATE(I) !$OMP SECTIONS !$OMP SECTION DO I = 1, N

C(I) = A(I) + B(I) ENDDO !$OMP SECTION DO I = 1, N

D(I) = A(I) * B(I) ENDDO

!$OMP END SECTIONS NOWAIT !$OMP END PARALLEL WRITE(*,*) (C(I),I=1,N) WRITE(*,*) (D(I),I=1,N)

END

例子3:WORKSHARE主要用法 PROGRAM WORKSHARE

INTEGER N, I, J

PARAMETER (N=100)

REAL AA(N,N), BB(N,N), CC(N,N), DD(N,N), FIRST, LAST

! Some initializations DO I = 1, N DO J = 1, N

AA(J,I) = I * 1.0 BB(J,I) = J + 1.0 ENDDO ENDDO

!$OMP PARALLEL SHARED(AA,BB,CC,DD,FIRST,LAST)

!$OMP WORKSHARE CC = AA * BB DD = AA + BB

FIRST = CC(1,1) + DD(1,1) LAST = CC(N,N) + DD(N,N) !$OMP END WORKSHARE NOWAIT

!$OMP END PARALLEL !WRITE(*,*) CC WRITE(*,*) FIRST

END

例子4:Fortran - PARALLEL DO Directive Example PROGRAM VECTOR_ADD

INTEGER N, I, CHUNKSIZE, CHUNK PARAMETER (N=1000)

PARAMETER (CHUNKSIZE=100) REAL A(N), B(N), C(N)

! Some initializations DO I = 1, N A(I) = I * 1.0 B(I) = A(I) ENDDO

CHUNK = CHUNKSIZE

!$OMP PARALLEL DO

!$OMP& SHARED(A,B,C,CHUNK) PRIVATE(I) !$OMP& SCHEDULE(STATIC,CHUNK)

DO I = 1, N

C(I) = A(I) + B(I) ENDDO

!$OMP END PARALLEL DO

END

例5:LOCK功能的实现与!$OMP CRITICAL功能实现达到相同的输出效果 program Main use omp_lib implicit none

integer(kind = OMP_lock_kind) :: lck integer(kind = OMP_integer_kind) :: ID

integer(kind = OMP_integer_kind) :: number_of_threads !call OMP_set_num_threads(number_of_threads) call OMP_init_lock(lck)

!$OMP PARALLEL SHARED(LCK) PRIVATE(ID) ID = OMP_get_thread_num() call OMP_set_lock(lck)

write(*,*) \, ID call OMP_unset_lock(lck) !$OMP END PARALLEL call OMP_destroy_lock(lck) end program Main

program Main use omp_lib implicit none

integer(kind = OMP_integer_kind) :: lck integer(kind = OMP_integer_kind) :: ID

!$OMP PARALLEL SHARED(LCK) PRIVATE(ID) ID = OMP_get_thread_num() !$OMP CRITICAL

write(*,*) \, ID !$OMP END CRITICAL !$OMP END PARALLEL end program Main

例6、lock举例 module data_types

use omp_lib, only: OMP_nest_lock_kind implicit none type number integer :: n

integer(OMP_nest_lock_kind) :: lck end type number

end module data_types

!---------------------------------------------------------! program Main use omp_lib use data_types implicit none type(number) :: x

integer(OMP_nest_lock_kind) :: lck x%n = 0

call OMP_init_lock(x%lck)

!$OMP PARALLEL SECTIONS SHARED(x) !$OMP SECTION call add(x,20) !$OMP SECTION call substract(x,10)

!$OMP END PARALLEL SECTIONS call OMP_destroy_lock(lck) end program Main

!---------------------------------------------------------! subroutine add(x,d) use omp_lib use data_types implicit none type(number) :: x integer :: d

call OMP_set_nest_lock(x%lck) x%n = x%n + d

call OMP_unset_nest_lock(x%lck) end subroutine add

!----------------------------------------------------------! subroutine substract(x,d) use omp_lib use data_types implicit none type(number) :: x integer :: d

call OMP_set_nest_lock(x%lck) call add(x,-d)

call OMP_unset_nest_lock(x%lck) end subroutine substract

例子 测试LASTPRIVATE的功能 program main

!$OMP PARALLEL DO PRIVATE(i) LASTPRIVATE(a) do i = 1, 1000 a = i enddo

!$OMP END PARALLEL DO write(*,*) a end

例子 测试 FIRSTPRIVATE(a) 的功能 program main implicit none integer a,i a=100

!$OMP PARALLEL FIRSTPRIVATE(a) PRIVATE(i) !$OMP DO REDUCTION(+:a) do i = 1, 4 a = a + i enddo

!$OMP END DO write(*,*) a

!$OMP END PARALLEL write(*,*) a End

例子:测试!$OMP DO REDUCTION(+:a)

program main

implicit none

integer a,i,CHUNKSIZE,CHUNK

PARAMETER (CHUNKSIZE=2)

CHUNK = CHUNKSIZE

a=100

!$OMP PARALLEL FIRSTPRIVATE(a) PRIVATE(i)

!$OMP DO REDUCTION(+:a) do i = 1, 5 a = a + i enddo

!$OMP END DO

write(*,*) a

!$OMP END PARALLEL

write(*,*) a end

本文来源:https://www.bwwdw.com/article/e3na.html

Top