日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Fortran并行计算的一些例子

發(fā)布時(shí)間:2023/12/14 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Fortran并行计算的一些例子 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Fortran并行計(jì)算的一些例子

以下例子來自https://computing.llnl.gov/tutorials/openMP/exercise.html網(wǎng)站

一、打印線程(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

?二、循環(huán)(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?向北方 閱讀(...) 評(píng)論(...) 編輯 收藏

轉(zhuǎn)載于:https://www.cnblogs.com/China3S/p/3500478.html

總結(jié)

以上是生活随笔為你收集整理的Fortran并行计算的一些例子的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。