DO/END DO

用途

DO (工作共用) 建構可讓您在遇到迴圈的團隊成員之間劃分迴圈的執行。 END DO 指引可讓您指出 DO (工作共用) 指引所指定 DO 迴圈的結尾。

必要選項

-qsmp

語法

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

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

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

其中 do_clause 是:

讀取語法圖跳過視覺化語法圖collapse_clausefirstprivate_clauselastprivate_clauseordered_clauseprivate_clausereduction_c子句schedule_clause
collapse_clause
請參閱- COLOR
firstprivate_clause
請參閱- FIRSTprivate
lastprivate_clause
請參閱- LASTPRIVATE
ordered_clause
請參閱- ORDERED
private_clause
請參閱- PRIVATE
reduction_clause
請參閱- 縮減
schedule_clause
請參閱- SCHEDULE

規則

DO (工作共用) 指引後面的第一個非註解行 (不包括其他指引) 必須是 DO 迴圈。 這一行不能是無限 DODO WHILE 迴圈。 DO (work-sharing) 指引僅適用於緊接在指引之後的 DO 迴圈,不適用於任何巢狀 DO 迴圈,除非指定 COLLAPSE 子句

END DO 指引是選用的。 如果您使用 END DO 指引,它必須緊接在 DO 迴圈的結尾。

您可能有一個包含數個 DO 陳述式的 DO 建構。 如果 DO 陳述式共用相同的 DO 終止陳述式,且建構後面有 END DO 指引,則您只能針對建構最外層的 DO 陳述式指定工作共用 DO 指引。

如果您在 END DO 指引上指定 NOWAIT ,則提早完成迴圈反覆運算的執行緒將繼續遵循迴圈之後的指示。 執行緒不會等待團隊的其他執行緒完成 DO 迴圈。 如果您未在 END DO 指引上指定 NOWAIT ,則每一個執行緒會在 DO 迴圈結束時等待相同團隊內的所有其他執行緒。

如果您未指定 NOWAIT 子句,則 END DO 指引暗示沒有 variable_name_listFLUSH 指引。

如果任何執行緒遇到 DO (工作共用) 指引,則團隊中的所有執行緒都必須遇到該指引。 DO 迴圈必須針對團隊中的每一個執行緒具有相同的迴圈界限及步驟值。 團隊中所有執行緒必須以相同順序來發現所發現的所有工作共用建構及 BARRIER 指引。

DO (工作共用) 指引不得出現在 CRITICALMASTERORDERED 區域內。 此外,除非它連結至另一個平行區域,否則不得出現在工作共用區域或 TASK 區域中。

您無法遵循另一個 DO (work-sharing) 指引的 DO (work-sharing) 指引。 對於給定的 DO 迴圈,您只能指定一個 DO (工作共用) 指引。

DO (工作共用) 指引不能與給定 DO 迴圈的 INDEPENDENTDO SERIAL 指引一起出現。

為了確保在兩個工作共用迴圈區域中使用相同的邏輯反覆運算號碼指派給執行緒,您可以使用 SCHEDULE 子句的 STATIC 排程。 如需詳細資料,請參閱 SCHEDULE

範例

Example 1: PARALLEL 建構內數個獨立 DO 迴圈的範例。 在第一個工作共用 DO 迴圈之後,不會執行同步化,因為在 END DO 指引上指定了 NOWAIT

!$OMP PARALLEL
!$OMP DO
      DO I = 2, N
        B(I)= (A(I) + A(I-1)) / 2.0
      END DO
!$OMP END DO NOWAIT
!$OMP DO
      DO J = 2, N
         C(J) = SQRT(REAL(J*J))
      END DO
!$OMP END DO
      C(5) = C(5) + 10
!$OMP END PARALLEL
      END

Example 2: SHAREDSCHEDULE 子句的範例。

!$OMP PARALLEL SHARED(A)
!$OMP DO SCHEDULE(STATIC,10)
      DO I = 1, 1000
         A(I) = I * 4
      END DO
!$OMP END DO
!$OMP END PARALLEL

Example 3: MASTER DO (工作共用) 指引的範例,它們會連結至最接近含括的 PARALLEL 指引。

!$OMP PARALLEL DEFAULT(PRIVATE), SHARED(X)
      Y = 100
!$OMP MASTER
      PRINT *, Y
!$OMP END MASTER
!$OMP DO
      DO I = 1, 10
         X(I) = I
         X(I) = X(I) + Y
      END DO
!$OMP END PARALLEL
      END

Example 4: FIRSTPRIVATEDO (工作共用) 指引上 LASTPRIVATE 子句的範例。

      X = 100

!$OMP PARALLEL PRIVATE(I), SHARED(X,Y)
!$OMP DO FIRSTPRIVATE(X), LASTPRIVATE(X)
      DO I = 1, 80
         Y(I) = X + I
         X = I
      END DO
!$OMP END PARALLEL
      END