PARALLEL DO/END PARALLEL DO

用途

PARALLEL DO 指引可讓您指定編譯器應該平行化的迴圈。 這在語意上相當於:
!$OMP PARALLEL
!$OMP DO
 ...
!$OMP END DO
!$OMP END PARALLEL
是一種方便迴圈並行化的方法。 END PARALLEL DO 指引可讓您指出 PARALLEL DO 指引所指定 DO 迴圈的結尾。

必要選項

-qsmp

語法

讀取語法圖跳過視覺化語法圖PARALLEL DO ,parallel_do_clause

讀取語法圖跳過視覺化語法圖parallel_do_loops

讀取語法圖跳過視覺化語法圖END PARALLEL DO

其中 parallel_do_clause 是:

讀取語法圖跳過視覺化語法圖collapse_clausecopyin_clausedefault_clausefirstprivate_clauseif_clauselastprivate_clausenum_threads_clauseordered_clauseprivate_clausereduction_c子句schedule_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 迴圈。 這一行不能是無限 DODO 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 指引一起出現。

附註: 您應該使用 PARALLEL DO 指引,以在多個供應商之間提供最大可攜性。 PARALLEL DO 指引是規範指引,而 INDEPENDENT 指引則是關於迴圈性質的主張。 (如需相關資訊,請參閱 INDEPENDENT 指引。)

IF 子句在 PARALLEL DO 指引中最多可以出現一次。

在平行建構的環境定義之外,會評估 IF 表示式。 IF 表示式中的任何函數參照都不得有負面影響。

依預設,不論 IF 子句的設定為何,都會序列化巢狀平行迴圈。 您可以使用 -qsmp=nested_par 編譯器選項來變更此預設值。

如果內部 DO 迴圈的 REDUCTION 變數出現在含括 DO 迴圈或 PARALLEL SECTIONS 建構的 PRIVATELASTPRIVATE 子句中,則必須在內部 DO 迴圈之前起始設定該變數。

在含括 DO 迴圈之 INDEPENDENT 指引的 REDUCTION 子句中出現的變數,不得同時出現在 PRIVATELASTPRIVATE 子句的 data_scope_entity_list 中。

PARALLEL DO 建構內,依預設會假設 PRIVATE 子句中未出現的變數共用。

在平行區域中執行輸入/輸出作業時應該小心。 如果多個執行緒在相同裝置上執行 Fortran I/O 陳述式,您應該確定執行緒已同步。 如果沒有,則未定義行為。 另請注意,雖然在 XL Fortran 實作中,每一個執行緒對 I/O 單元具有互斥存取權,但 OpenMP 規格不需要互斥存取。

連結至平行區域的指引將連結至該平行區域,即使它已序列化也一樣。

END PARALLEL DO 指引意指不含 variable_name_list BARRIER 指引FLUSH 指引。

範例

Example 1: 具有 LASTPRIVATE 子句的有效範例。
!$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
Example 2: 具有 REDUCTION 子句的有效範例。
!$OMP PARALLEL DO PRIVATE(I), REDUCTION(+:MYSUM)
      DO I = 1, 10
        MYSUM = MYSUM + IARR(I)
      END DO
Example 3: 一個有效範例,其中多個執行緒會存取標示為 SHARED的變數,但該變數僅在 CRITICAL 建構中使用。
!$OMP  PARALLEL DO SHARED (X)
     DO I = 1, 10
             A(I) = A(I) * I
!$OMP        CRITICAL
               X = X + A(I)
!$OMP        END CRITICAL
          END DO

Example 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