PARALLEL DO/END PARALLEL DO
用途
!$OMP PARALLEL
!$OMP DO
...
!$OMP END DO
!$OMP END PARALLEL是一種方便迴圈並行化的方法。 END PARALLEL DO 指引可讓您指出 PARALLEL DO 指引所指定 DO 迴圈的結尾。必要選項
-qsmp
語法
其中 parallel_do_clause 是:
- collapse_clause
- 請參閱- COLOR
- copyin_clause
- 請參閱- COPYIN
- default_clause
- 請參閱- DEFAULT
- if_clause
- 請參閱- IF。
- firstprivate_clause
- 請參閱- FIRSTprivate。
- lastprivate_clause
- 請參閱- LASTPRIVATE。
- num_threads_clause
- 請參閱- NUM_THREADS。
- ordered_clause
- 請參閱- ORDERED
- private_clause
- 請參閱- PRIVATE
- reduction_clause
- 請參閱- 縮減
- schedule_clause
- 請參閱- SCHEDULE
- shared_clause
- 請參閱- SHARED
規則
PARALLEL DO 指引之後的第一個非註解行 (不包括其他指引) 必須是 DO 迴圈。 這一行不能是無限 DO 或 DO WHILE 迴圈。 PARALLEL DO 指引僅適用於緊接在指引後面的 DO 迴圈,而不適用於任何巢狀 DO 迴圈,除非指定 COLLAPSE 子句。
如果您透過 PARALLEL DO 指引指定 DO 迴圈,則 END PARALLEL DO 指引是選用的。 如果您使用 END PARALLEL DO 指引,它必須緊接在 DO 迴圈的結尾。
您可能有一個包含數個 DO 陳述式的 DO 建構。 如果 DO 陳述式共用相同的 DO 終止陳述式,且建構後面有 END PARALLEL DO 指引,則您只能針對建構最外層的 DO 陳述式指定 PARALLEL DO 指引。
您不得在 PARALLEL DO 指引後面跟著 DO (工作共用) 或 DO SERIAL 指引。 您只能為給定 DO 迴圈指定一個 PARALLEL DO 指引。
團隊中所有執行緒必須以相同順序來發現所發現的所有工作共用建構及 BARRIER 指引。
對於給定的 DO 迴圈, PARALLEL DO 指引不得與 INDEPENDENT 指引一起出現。
IF 子句在 PARALLEL DO 指引中最多可以出現一次。
在平行建構的環境定義之外,會評估 IF 表示式。 IF 表示式中的任何函數參照都不得有負面影響。
依預設,不論 IF 子句的設定為何,都會序列化巢狀平行迴圈。 您可以使用 -qsmp=nested_par 編譯器選項來變更此預設值。
如果內部 DO 迴圈的 REDUCTION 變數出現在含括 DO 迴圈或 PARALLEL SECTIONS 建構的 PRIVATE 或 LASTPRIVATE 子句中,則必須在內部 DO 迴圈之前起始設定該變數。
在含括 DO 迴圈之 INDEPENDENT 指引的 REDUCTION 子句中出現的變數,不得同時出現在 PRIVATE 或 LASTPRIVATE 子句的 data_scope_entity_list 中。
在 PARALLEL DO 建構內,依預設會假設 PRIVATE 子句中未出現的變數共用。
在平行區域中執行輸入/輸出作業時應該小心。 如果多個執行緒在相同裝置上執行 Fortran I/O 陳述式,您應該確定執行緒已同步。 如果沒有,則未定義行為。 另請注意,雖然在 XL Fortran 實作中,每一個執行緒對 I/O 單元具有互斥存取權,但 OpenMP 規格不需要互斥存取。
連結至平行區域的指引將連結至該平行區域,即使它已序列化也一樣。
END PARALLEL DO 指引意指不含 variable_name_list 及 BARRIER 指引的 FLUSH 指引。
範例
!$OMP PARALLEL DO PRIVATE(I), LASTPRIVATE (X)
DO I = 1,10
X = I * I
A(I) = X * B(I)
END DO
PRINT *, X ! X has the value 100!$OMP PARALLEL DO PRIVATE(I), REDUCTION(+:MYSUM)
DO I = 1, 10
MYSUM = MYSUM + IARR(I)
END DO!$OMP PARALLEL DO SHARED (X)
DO I = 1, 10
A(I) = A(I) * I
!$OMP CRITICAL
X = X + A(I)
!$OMP END CRITICAL
END DOExample 4: END PARALLEL DO 指引的有效範例。
REAL A(100), B(2:100), C(100)
!$OMP PARALLEL DO
DO I = 2, 100
B(I) = (A(I) + A(I-1))/2.0
END DO
!$OMP END PARALLEL DO
!$OMP PARALLEL DO
DO J = 1, 100
C(J) = X + COS(J*5.5)
END DO
!$OMP END PARALLEL DO
END 