Fortran并行计算的一些例子

以下例子来自https://computing.llnl.gov/tutorials/openMP/exercise.html网站

一、打印线程(Hello world)

C******************************************************************************
C FILE: omp_hello.f
C DESCRIPTION:
C   OpenMP Example - Hello World - Fortran Version
C   In this simple example, the master thread forks a parallel region.
C   All threads in the team obtain their unique thread number and print it.
C   The master thread only prints the total number of threads.  Two OpenMP
C   library routines are used to obtain the number of threads and each
C   thread's number.
C AUTHOR: Blaise Barney  5/99
C LAST REVISED:
C******************************************************************************PROGRAM HELLOINTEGER NTHREADS, TID, OMP_GET_NUM_THREADS, OMP_GET_THREAD_NUMC     Fork a team of threads giving them their own copies of variables
!$OMP PARALLEL PRIVATE(NTHREADS, TID)C     Obtain thread numberTID = OMP_GET_THREAD_NUM()PRINT *, 'Hello World from thread = ', TIDC     Only master thread does thisIF (TID .EQ. 0) THENNTHREADS = OMP_GET_NUM_THREADS()PRINT *, 'Number of threads = ', NTHREADSEND IFC     All threads join master thread and disband
!$OMP END PARALLELEND

二、循环(Loop work-sharing)

 1 C******************************************************************************
 2 C FILE: omp_workshare1.f
 3 C DESCRIPTION:
 4 C   OpenMP Example - Loop Work-sharing - Fortran Version
 5 C   In this example, the iterations of a loop are scheduled dynamically
 6 C   across the team of threads.  A thread will perform CHUNK iterations
 7 C   at a time before being scheduled for the next CHUNK of work.
 8 C AUTHOR: Blaise Barney  5/99
 9 C LAST REVISED: 01/09/04
10 C******************************************************************************
11
12       PROGRAM WORKSHARE1
13
14       INTEGER NTHREADS, TID, OMP_GET_NUM_THREADS,
15      +  OMP_GET_THREAD_NUM, N, CHUNKSIZE, CHUNK, I
16       PARAMETER (N=100)
17       PARAMETER (CHUNKSIZE=10)
18       REAL A(N), B(N), C(N)
19
20 !     Some initializations
21       DO I = 1, N
22         A(I) = I * 1.0
23         B(I) = A(I)
24       ENDDO
25       CHUNK = CHUNKSIZE
26
27 !$OMP PARALLEL SHARED(A,B,C,NTHREADS,CHUNK) PRIVATE(I,TID)
28
29       TID = OMP_GET_THREAD_NUM()
30       IF (TID .EQ. 0) THEN
31         NTHREADS = OMP_GET_NUM_THREADS()
32         PRINT *, 'Number of threads =', NTHREADS
33       END IF
34       PRINT *, 'Thread',TID,' starting...'
35 !$OMP DO SCHEDULE(DYNAMIC,CHUNK)
36       DO I = 1, N
37         C(I) = A(I) + B(I)
38         WRITE(*,100) TID,I,C(I)
39  100    FORMAT(' Thread',I2,': C(',I3,')=',F8.2)
40       ENDDO
41 !$OMP END DO NOWAIT
42       PRINT *, 'Thread',TID,' done.'
43 !$OMP END PARALLEL
44
45       END

三、Sections work-sharing

C******************************************************************************
C FILE: omp_workshare2.f
C DESCRIPTION:
C   OpenMP Example - Sections Work-sharing - Fortran Version
C   In this example, the OpenMP SECTION directive is used to assign
C   different array operations to each thread that executes a SECTION.
C AUTHOR: Blaise Barney  5/99
C LAST REVISED: 07/16/07
C******************************************************************************PROGRAM WORKSHARE2INTEGER N, I, NTHREADS, TID, OMP_GET_NUM_THREADS, +        OMP_GET_THREAD_NUMPARAMETER (N=50)REAL A(N), B(N), C(N), D(N)!     Some initializationsDO I = 1, NA(I) = I * 1.5B(I) = I + 22.35C(N) = 0.0D(N) = 0.0ENDDO!$OMP PARALLEL SHARED(A,B,C,D,NTHREADS), PRIVATE(I,TID)TID = OMP_GET_THREAD_NUM()IF (TID .EQ. 0) THENNTHREADS = OMP_GET_NUM_THREADS()PRINT *, 'Number of threads =', NTHREADSEND IFPRINT *, 'Thread',TID,' starting...'!$OMP SECTIONS!$OMP SECTIONPRINT *, 'Thread',TID,' doing section 1'DO I = 1, NC(I) = A(I) + B(I)WRITE(*,100) TID,I,C(I)100     FORMAT(' Thread',I2,': C(',I2,')=',F8.2)ENDDO!$OMP SECTIONPRINT *, 'Thread',TID,' doing section 2'DO I = 1, ND(I) = A(I) * B(I)WRITE(*,100) TID,I,D(I)ENDDO!$OMP END SECTIONS NOWAITPRINT *, 'Thread',TID,' done.'!$OMP END PARALLELEND

四、Combined parallel loop reduction

C******************************************************************************
C FILE: omp_reduction.f
C DESCRIPTION:
C   OpenMP Example - Combined Parallel Loop Reduction - Fortran Version
C   This example demonstrates a sum reduction within a combined parallel loop
C   construct.  Notice that default data element scoping is assumed - there
C   are no clauses specifying shared or private variables.  OpenMP will
C   automatically make loop index variables private within team threads, and
C   global variables shared.
C AUTHOR: Blaise Barney  5/99
C LAST REVISED:
C******************************************************************************PROGRAM REDUCTIONINTEGER I, NREAL A(100), B(100), SUM!     Some initializationsN = 100DO I = 1, NA(I) = I *1.0B(I) = A(I)ENDDOSUM = 0.0!$OMP PARALLEL DO REDUCTION(+:SUM)DO I = 1, NSUM = SUM + (A(I) * B(I))ENDDOPRINT *, '   Sum = ', SUMEND

五、Orphaned parallel loop reduction

C******************************************************************************
C FILE: omp_orphan.f
C DESCRIPTION:
C   OpenMP Example - Parallel region with an orphaned directive - Fortran
C   Version
C   This example demonstrates a dot product being performed by an orphaned
C   loop reduction construct.  Scoping of the reduction variable is critical.
C AUTHOR: Blaise Barney  5/99
C LAST REVISED:
C******************************************************************************PROGRAM ORPHANCOMMON /DOTDATA/ A, B, SUMINTEGER I, VECLENPARAMETER (VECLEN = 100)REAL*8 A(VECLEN), B(VECLEN), SUMDO I=1, VECLENA(I) = 1.0 * IB(I) = A(I)ENDDOSUM = 0.0
!$OMP PARALLELCALL DOTPROD
!$OMP END PARALLELWRITE(*,*) "Sum = ", SUMENDSUBROUTINE DOTPRODCOMMON /DOTDATA/ A, B, SUMINTEGER I, TID, OMP_GET_THREAD_NUM, VECLENPARAMETER (VECLEN = 100)REAL*8 A(VECLEN), B(VECLEN), SUMTID = OMP_GET_THREAD_NUM()
!$OMP DO REDUCTION(+:SUM)DO I=1, VECLENSUM = SUM + (A(I)*B(I))PRINT *, '  TID= ',TID,'I= ',IENDDORETURNEND

六、Matrix multiply

C******************************************************************************
C FILE: omp_mm.f
C DESCRIPTION:
C   OpenMp Example - Matrix Multiply - Fortran Version
C   Demonstrates a matrix multiply using OpenMP. Threads share row iterations
C   according to a predefined chunk size.
C AUTHOR: Blaise Barney
C LAST REVISED: 1/5/04 Blaise Barney
C******************************************************************************PROGRAM MATMULTINTEGER  NRA, NCA, NCB, TID, NTHREADS, I, J, K, CHUNK,+         OMP_GET_NUM_THREADS, OMP_GET_THREAD_NUM
C     number of rows in matrix A PARAMETER (NRA=62)
C     number of columns in matrix APARAMETER (NCA=15)
C     number of columns in matrix BPARAMETER (NCB=7)REAL*8 A(NRA,NCA), B(NCA,NCB), C(NRA,NCB)C     Set loop iteration chunk size CHUNK = 10C     Spawn a parallel region explicitly scoping all variables
!$OMP PARALLEL SHARED(A,B,C,NTHREADS,CHUNK) PRIVATE(TID,I,J,K)TID = OMP_GET_THREAD_NUM()IF (TID .EQ. 0) THENNTHREADS = OMP_GET_NUM_THREADS()PRINT *, 'Starting matrix multiple example with', NTHREADS,+           'threads'PRINT *, 'Initializing matrices'END IFC     Initialize matrices
!$OMP DO SCHEDULE(STATIC, CHUNK)DO 30 I=1, NRADO 30 J=1, NCAA(I,J) = (I-1)+(J-1)30  CONTINUE
!$OMP DO SCHEDULE(STATIC, CHUNK)DO 40 I=1, NCADO 40 J=1, NCBB(I,J) = (I-1)*(J-1)40  CONTINUE
!$OMP DO SCHEDULE(STATIC, CHUNK)DO 50 I=1, NRADO 50 J=1, NCBC(I,J) = 050  CONTINUEC     Do matrix multiply sharing iterations on outer loop
C     Display who does which iterations for demonstration purposesPRINT *, 'Thread', TID, 'starting matrix multiply...'
!$OMP DO SCHEDULE(STATIC, CHUNK)DO 60 I=1, NRAPRINT *, 'Thread', TID, 'did row', IDO 60 J=1, NCBDO 60 K=1, NCAC(I,J) = C(I,J) + A(I,K) * B(K,J)60  CONTINUEC     End of parallel region
!$OMP END PARALLELC     Print resultsPRINT *, '******************************************************'PRINT *, 'Result Matrix:'DO 90 I=1, NRADO 80 J=1, NCBWRITE(*,70) C(I,J)70      FORMAT(2x,f8.2,$)80      CONTINUEPRINT *, ' '90      CONTINUEPRINT *, '******************************************************'PRINT *, 'Done.'END

七、Get and print environment information

C******************************************************************************
C FILE: omp_getEnvInfo.f
C DESCRIPTION:
C   OpenMP Example - Get Environment Information - Fortran Version
C   The master thread queries and prints selected environment information.
C AUTHOR: Blaise Barney  7/06
C LAST REVISED: 07/12/06
C******************************************************************************PROGRAM GETINFOINTEGER NTHREADS, TID, OMP_GET_NUM_THREADS,+  OMP_GET_THREAD_NUM, OMP_GET_NUM_PROCS, OMP_GET_MAX_THREADS,+  OMP_IN_PARALLEL, OMP_GET_DYNAMIC, OMP_GET_NESTED,+  PROCS, MAXTC     These are for AIX compilations
C     INTEGER INPAR, DYNAMIC, NESTED
C     These are for non-AIX compilationsLOGICAL INPAR, DYNAMIC, NESTEDC     Start parallel region
!$OMP PARALLEL PRIVATE(NTHREADS, TID)C     Obtain thread numberTID = OMP_GET_THREAD_NUM()C     Only master thread does thisIF (TID .EQ. 0) THENPRINT *, 'Thread',tid,'getting environment information'C     Get environment informationPROCS = OMP_GET_NUM_PROCS() NTHREADS = OMP_GET_NUM_THREADS()MAXT = OMP_GET_MAX_THREADS()INPAR = OMP_IN_PARALLEL()DYNAMIC = OMP_GET_DYNAMIC()NESTED = OMP_GET_NESTED()C     Print environment informationPRINT *, 'Number of processors = ', PROCSPRINT *, 'Number of threads = ', NTHREADSPRINT *, 'Max threads = ', MAXTPRINT *, 'In parallel? = ', INPARPRINT *, 'Dynamic threads enabled? = ', DYNAMICPRINT *, 'Nested parallelism supported? = ', NESTEDEND IFC     Done
!$OMP END PARALLELEND

八、Programs with bugs

(1)omp_bug1.f

C******************************************************************************
C FILE: omp_bug1.f
C DESCRIPTION:
C   This example attempts to show use of the PARALLEL DO construct.  However
C   it will generate errors at compile time.  Try to determine what is causing
C   the error.  See omp_bug1fix.f for a corrected version.
C AUTHOR: Blaise Barney  5/99
C LAST REVISED:
C******************************************************************************PROGRAM WORKSHARE3INTEGER TID, OMP_GET_THREAD_NUM, N, I, CHUNKSIZE, CHUNKPARAMETER (N=50)PARAMETER (CHUNKSIZE=5) REAL A(N), B(N), C(N)!     Some initializationsDO I = 1, NA(I) = I * 1.0B(I) = A(I)ENDDOCHUNK = CHUNKSIZE!$OMP  PARALLEL DO SHARED(A,B,C,CHUNK)
!$OMP& PRIVATE(I,TID)
!$OMP& SCHEDULE(STATIC,CHUNK)TID = OMP_GET_THREAD_NUM()DO I = 1, NC(I) = A(I) + B(I)PRINT *,'TID= ',TID,'I= ',I,'C(I)= ',C(I)ENDDO!$OMP  END PARALLEL DOEND

(2)omp_bug1fix.f

C******************************************************************************
C FILE: omp_bug1fix.f
C DESCRIPTION:
C   This is a corrected version of the omp_bug1fix.f example. Corrections
C   include removing all statements between the PARALLEL DO construct and
C   the actual DO loop, and introducing logic to preserve the ability to
C   query a thread's id and print it from inside the DO loop.
C AUTHOR: Blaise Barney  5/99
C LAST REVISED:
C******************************************************************************PROGRAM WORKSHARE4INTEGER TID, OMP_GET_THREAD_NUM, N, I, CHUNKSIZE, CHUNKPARAMETER (N=50)PARAMETER (CHUNKSIZE=5) REAL A(N), B(N), C(N)CHARACTER FIRST_TIME!     Some initializationsDO I = 1, NA(I) = I * 1.0B(I) = A(I)ENDDOCHUNK = CHUNKSIZEFIRST_TIME = 'Y'!$OMP  PARALLEL DO SHARED(A,B,C,CHUNK)
!$OMP& PRIVATE(I,TID)
!$OMP& SCHEDULE(STATIC,CHUNK)
!$OMP& FIRSTPRIVATE(FIRST_TIME) DO I = 1, NIF (FIRST_TIME .EQ. 'Y') THENTID = OMP_GET_THREAD_NUM()FIRST_TIME = 'N'ENDIFC(I) = A(I) + B(I)PRINT *,'TID= ',TID,'I= ',I,'C(I)= ',C(I)ENDDO!$OMP  END PARALLEL DOEND

(3)omp_bug2.f

C******************************************************************************
C FILE: omp_bug2.f
C DESCRIPTION:
C   Another OpenMP program with a bug
C AUTHOR: Blaise Barney  1/7/04
C LAST REVISED:
C******************************************************************************PROGRAM BUG2INTEGER NTHREADS, I, TID, OMP_GET_NUM_THREADS,+        OMP_GET_THREAD_NUMREAL*8 TOTALC     Spawn parallel region
!$OMP PARALLEL C     Obtain thread numberTID = OMP_GET_THREAD_NUM()
C     Only master thread does thisIF (TID .EQ. 0) THENNTHREADS = OMP_GET_NUM_THREADS()PRINT *, 'Number of threads = ', NTHREADSEND IFPRINT *, 'Thread ',TID,'is starting...'!$OMP BARRIERC     Do some workTOTAL = 0.0
!$OMP DO SCHEDULE(DYNAMIC,10)DO I=1, 1000000TOTAL = TOTAL + I * 1.0END DOWRITE(*,100) TID,TOTAL100  FORMAT('Thread',I2,' is done! Total= ',E12.6)!$OMP END PARALLELEND

(4)omp_bug3.f

C******************************************************************************
C FILE: omp_bug3.f
C DESCRIPTION:
C   Run time bug
C AUTHOR: Blaise Barney  01/09/04
C LAST REVISED: 06/28/05
C******************************************************************************PROGRAM BUG3INTEGER N, I, NTHREADS, TID, SECTION, OMP_GET_NUM_THREADS, +        OMP_GET_THREAD_NUMPARAMETER (N=50)REAL A(N), B(N), C(N)C     Some initializationsDO I = 1, NA(I) = I * 1.0B(I) = A(I)ENDDO!$OMP PARALLEL PRIVATE(C,I,TID,SECTION)TID = OMP_GET_THREAD_NUM()IF (TID .EQ. 0) THENNTHREADS = OMP_GET_NUM_THREADS()PRINT *, 'Number of threads = ', NTHREADSEND IFC     Use barriers for clean output
!$OMP BARRIERPRINT *, 'Thread ',TID,' starting...'
!$OMP BARRIER!$OMP SECTIONS
!$OMP SECTIONSECTION = 1DO I = 1, NC(I) = A(I) * B(I)ENDDOCALL PRINT_RESULTS(C, TID, SECTION)!$OMP SECTIONSECTION = 2DO I = 1, NC(I) = A(I) + B(I)ENDDOCALL PRINT_RESULTS(C, TID, SECTION)!$OMP END SECTIONS C     Use barrier for clean output
!$OMP BARRIERPRINT *, 'Thread',tid,' exiting...'!$OMP END PARALLELENDSUBROUTINE PRINT_RESULTS(C, TID, SECTION)INTEGER TID, SECTION, N, I, JPARAMETER (N=50)REAL C(N)J = 1
C     Use critical for clean output
!$OMP CRITICALPRINT *, ' 'PRINT *, 'Thread',TID,' did section',SECTIONDO I=1, NWRITE(*,100) C(I)100    FORMAT(E12.6,$)J = J + 1IF (J .EQ. 6) THENPRINT *, ' 'J = 1END IFEND DOPRINT *, ' '
!$OMP END CRITICAL!$OMP BARRIERPRINT *,'Thread',TID,' done and synchronized'END SUBROUTINE PRINT_RESULTS

(4)omp_bug4.f

C******************************************************************************
C FILE: omp_bug4.f
C DESCRIPTION:
C   This very simple program causes a segmentation fault.
C AUTHOR: Blaise Barney  01/09/04
C LAST REVISED:
C******************************************************************************PROGRAM BUG4INTEGER N, NTHREADS, TID, I, J, OMP_GET_NUM_THREADS,+        OMP_GET_THREAD_NUMPARAMETER(N=1048)REAL*8 A(N,N)C     Fork a team of threads with explicit variable scoping
!$OMP PARALLEL SHARED(NTHREADS) PRIVATE(I,J,TID,A)C     Obtain/print thread infoTID = OMP_GET_THREAD_NUM()IF (TID .EQ. 0) THENNTHREADS = OMP_GET_NUM_THREADS()PRINT *, 'Number of threads = ', NTHREADSEND IFPRINT *, 'Thread',TID,' starting...'C     Each thread works on its own private copy of the arrayDO I=1,NDO J=1,NA(J,I) = TID + I + JEND DOEND DOC     For confirmationPRINT *, 'Thread',TID,'done. Last element=',A(N,N)C     All threads join master thread and disband
!$OMP END PARALLELEND

(5)omp_bug4fix.f

#!/bin/csh#******************************************************************************
# FILE: omp_bug4fix
# DESCRIPTION:
#   This script is used to set the thread stack size limit to accomodate
#   the omp_bug4 example. The example code requires @16MB per thread. For
#   safety, this script sets the stack limit to 20MB. Note that the way
#   to do this differs between architectures.
# AUTHOR: Blaise Barney  01/12/04
# LAST REVISED:
#*****************************************************************************/# This is for all systems
limit stacksize unlimited# This is for IBM AIX systems
setenv XLSMPOPTS "stack=20000000"# This is for Linux systems
setenv KMP_STACKSIZE 20000000# This is for HP/Compaq Tru64 systems
setenv MP_STACK_SIZE 20000000# Now call the executable - change the name to match yours
omp_bug4

(6)omp_bug5.f

C******************************************************************************
C FILE: omp_bug5.f
C DESCRIPTION:
C   Using SECTIONS, two threads initialize their own array and then add
C   it to the other's array, however a deadlock occurs.
C AUTHOR: Blaise Barney  01/09/04
C LAST REVISED:
C******************************************************************************PROGRAM BUG5INTEGER*8 LOCKA, LOCKBINTEGER NTHREADS, TID, I, +        OMP_GET_NUM_THREADS, OMP_GET_THREAD_NUMPARAMETER (N=1000000)REAL A(N), B(N), PI, DELTAPARAMETER (PI=3.1415926535)PARAMETER (DELTA=.01415926535)C     Initialize the locksCALL OMP_INIT_LOCK(LOCKA)CALL OMP_INIT_LOCK(LOCKB)C     Fork a team of threads giving them their own copies of variables
!$OMP PARALLEL SHARED(A, B, NTHREADS, LOCKA, LOCKB) PRIVATE(TID)C     Obtain thread number and number of threadsTID = OMP_GET_THREAD_NUM()
!$OMP MASTERNTHREADS = OMP_GET_NUM_THREADS()PRINT *, 'Number of threads = ', NTHREADS
!$OMP END MASTERPRINT *, 'Thread', TID, 'starting...'
!$OMP BARRIER!$OMP SECTIONS!$OMP SECTIONPRINT *, 'Thread',TID,' initializing A()'CALL OMP_SET_LOCK(LOCKA)DO I = 1, NA(I) = I * DELTAENDDOCALL OMP_SET_LOCK(LOCKB)PRINT *, 'Thread',TID,' adding A() to B()'DO I = 1, NB(I) = B(I) + A(I)ENDDOCALL OMP_UNSET_LOCK(LOCKB)CALL OMP_UNSET_LOCK(LOCKA)!$OMP SECTIONPRINT *, 'Thread',TID,' initializing B()'CALL OMP_SET_LOCK(LOCKB)DO I = 1, NB(I) = I * PIENDDOCALL OMP_SET_LOCK(LOCKA)PRINT *, 'Thread',TID,' adding B() to A()'DO I = 1, NA(I) = A(I) + B(I)ENDDOCALL OMP_UNSET_LOCK(LOCKA)CALL OMP_UNSET_LOCK(LOCKB)!$OMP END SECTIONS NOWAITPRINT *, 'Thread',TID,' done.'!$OMP END PARALLELEND

(7)omp_bug5fix.f

C******************************************************************************
C FILE: omp_bug5fix.f
C DESCRIPTION:
C   The problem in omp_bug5.f is that the first thread acquires locka and then
C   tries to get lockb before releasing locka. Meanwhile, the second thread
C   has acquired lockb and then tries to get locka before releasing lockb.
C   This solution overcomes the deadlock by using locks correctly.
C AUTHOR: Blaise Barney  01/09/04
C LAST REVISED:
C******************************************************************************PROGRAM BUG5INTEGER*8 LOCKA, LOCKBINTEGER NTHREADS, TID, I, +        OMP_GET_NUM_THREADS, OMP_GET_THREAD_NUMPARAMETER (N=1000000)REAL A(N), B(N), PI, DELTAPARAMETER (PI=3.1415926535)PARAMETER (DELTA=.01415926535)C     Initialize the locksCALL OMP_INIT_LOCK(LOCKA)CALL OMP_INIT_LOCK(LOCKB)C     Fork a team of threads giving them their own copies of variables
!$OMP PARALLEL SHARED(A, B, NTHREADS, LOCKA, LOCKB) PRIVATE(TID)C     Obtain thread number and number of threadsTID = OMP_GET_THREAD_NUM()
!$OMP MASTERNTHREADS = OMP_GET_NUM_THREADS()PRINT *, 'Number of threads = ', NTHREADS
!$OMP END MASTERPRINT *, 'Thread', TID, 'starting...'
!$OMP BARRIER!$OMP SECTIONS!$OMP SECTIONPRINT *, 'Thread',TID,' initializing A()'CALL OMP_SET_LOCK(LOCKA)DO I = 1, NA(I) = I * DELTAENDDOCALL OMP_UNSET_LOCK(LOCKA)CALL OMP_SET_LOCK(LOCKB)PRINT *, 'Thread',TID,' adding A() to B()'DO I = 1, NB(I) = B(I) + A(I)ENDDOCALL OMP_UNSET_LOCK(LOCKB)!$OMP SECTIONPRINT *, 'Thread',TID,' initializing B()'CALL OMP_SET_LOCK(LOCKB)DO I = 1, NB(I) = I * PIENDDOCALL OMP_UNSET_LOCK(LOCKB)CALL OMP_SET_LOCK(LOCKA)PRINT *, 'Thread',TID,' adding B() to A()'DO I = 1, NA(I) = A(I) + B(I)ENDDOCALL OMP_UNSET_LOCK(LOCKA)!$OMP END SECTIONS NOWAITPRINT *, 'Thread',TID,' done.'!$OMP END PARALLELEND

(8)omp_bug6.f

C******************************************************************************
C FILE: omp_bug6.f
C DESCRIPTION:
C   This program compiles and runs fine, but produces the wrong result.
C   Compare to omp_orphan.f.
C AUTHOR: Blaise Barney  6/05
C LAST REVISED: 06/27/05
C******************************************************************************PROGRAM ORPHANCOMMON /DOTDATA/ A, BINTEGER I, VECLENREAL*8 SUMPARAMETER (VECLEN = 100)REAL*8 A(VECLEN), B(VECLEN)DO I=1, VECLENA(I) = 1.0 * IB(I) = A(I)ENDDOSUM = 0.0
!$OMP PARALLEL SHARED (SUM)CALL DOTPROD
!$OMP END PARALLELWRITE(*,*) "Sum = ", SUMENDSUBROUTINE DOTPRODCOMMON /DOTDATA/ A, BINTEGER I, TID, OMP_GET_THREAD_NUM, VECLEN
c     REAL*8 SUMPARAMETER (VECLEN = 100)REAL*8 A(VECLEN), B(VECLEN)TID = OMP_GET_THREAD_NUM()
!$OMP DO REDUCTION(+:SUM)DO I=1, VECLENSUM = SUM + (A(I)*B(I))PRINT *, '  TID= ',TID,'I= ',IENDDORETURNEND

posted on 2014-01-01 11:52 向北方 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/China3S/p/3500478.html

Fortran并行计算的一些例子相关推荐

  1. PostgreSQL 10 自定义并行计算聚合函数的原理与实践

    标签 PostgreSQL , 聚合函数 , 自定义 , AGGREGATE , 并行 , COMBINEFUNC 背景 PostgreSQL 9.6开始就支持并行计算了,意味着聚合.扫描.排序.JO ...

  2. 每天看一个fortran文件(2)

    fortran不区分大小写 这个例子可以运行,结果是10 . 桩程序 不知道这个stub;do nothing 为什么要建立一个子程序 原来这可能是比较专业的程序员干的事情,他们的逻辑更为严密,为的是 ...

  3. mpi学习1:以C语言和fortran语言为例简单的接收发送

    mpi分为阻塞通信和非租塞通信两种.其中阻塞通信产生了等待时间的情况.(这个等待时间也是空闲时间)也可以说这个发送进程和接收进程需要相互等待对方. 以下为c语言和fortran语言的简单例子,并行为两 ...

  4. NumPy库的介绍与使用(一)

    目录 一.NumPy库简介 二.NumPy库入门 1.数据的维度 2.安装NumPy 3.导入NumPy库 三.NumPy的数组对象:ndarray 1 为什么要引入ndarry呢? 2. ndarr ...

  5. CC++面试题大汇总

    预处理器(Preprocessor) 1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * ...

  6. delphi 演示数据路径

    链接里默认的--------------------------- Error --------------------------- I/O error for file "C:\Prog ...

  7. webgl_gpgpu_birds 样例分析

    webgl_gpgpu_birds 是一个 three.js 的官方样例,这个例子模拟了鸟群的运动,是一个群组动画,并且动画的帧率也很高:鸟群的运动很自然,非常值得研究.类似的群组动画还有鱼群,boi ...

  8. RAD Studio 10 自带Demo代码汇总说明

    来源:https://www.cnblogs.com/findumars/p/5149128.html 大家好,好多朋友来信咨询Delphi和C++Builder的移动开发.DataSnap架构等问题 ...

  9. xe10 自带DEMO集合

    大家好,好多朋友来信咨询Delphi和C++Builder的移动开发.DataSnap架构等问题,希望能有Demo代码学习.其实Delphi和C++Builder本身自带有很多示例代码,已经覆盖了大部 ...

  10. 机器学习中的算法:决策树模型组合之随机森林(Random Forest)

    基础知识 [关于决策树的基础知识参考:http://blog.csdn.net/holybin/article/details/22914417] 在机器学习中,随机森林由许多的决策树组成,因为这些决 ...

最新文章

  1. Dynamics CRM 导入导出数据
  2. WPF命中测试示例(一)——坐标点命中测试
  3. 即日起更新机器学习相关博客
  4. 我们小时候,开学是这样的!差点看哭了!
  5. 1、excel常用技能(数据分列、数据快速浏览、转置、选择性粘贴运算、绘制对角线、单元格内换行、插入注解文字或图片)
  6. linux 网卡驱动分析,LINUX_网卡驱动分析
  7. “AI+”农业向农民致敬-丰收节交易会:谋定工业反哺农业
  8. oracle数据库硬恢复,Oracle数据库的可恢复性设置
  9. JavaScript调用WebServices
  10. PHP给后台管理系统加安全防护机制的一些方案
  11. keil如何添加h文件_如何给PDF文件添加水印?分享给PDF批量加水印的方法
  12. KITTI Benchmark原理_距离误差百分数
  13. gtk3基础知识的学习(C语言)
  14. Unity 删除物体
  15. windows 离线安装nessus
  16. 一周电商零售news汇总(1.18-1.25)​
  17. 数据结构——树和二叉树
  18. geant4 射线源定义_Geant4入门讲解篇-1
  19. 华为手机关闭云空间之类的通知的方法
  20. tensorflow安装之 nvidia官网下载cuda速度太慢!!!!! 还有 TensorFlow下载速度太慢

热门文章

  1. 算法笔记(胡凡)刷题笔记目录
  2. 第四届全国大学生GIS应用技能大赛开发题答案(非官方)
  3. 开机时无法进入系统,提示windows system32/winload.exe 无法加载
  4. Java疯狂讲义第五章笔记
  5. 正点原子STM32 ISP电路分析
  6. Android性能优化典范-第2季
  7. docker hub上镜像手动下载_Docker 下载镜像
  8. APPSCAN学习目录
  9. PuttyPsftp
  10. SQL Server数据库被置疑的解决方案