共用方式為


2.4.1 建構

指示詞會識別重複工作共用的建構,指定反覆項目相關聯的迴圈 (loop) 則會以平行方式執行。反覆項目的迴圈會分散到已存在於小組執行,它會繫結的平行建構的執行緒。語法建構如下:

#pragma omp for [clause[[,] clause] ... ] new-line
   for-loop

此子句會是下列其中一項:

私用 (變數清單)

firstprivate (變數清單)

lastprivate (變數清單)

reduction(operator : variable-list)

排序

schedule(kind, chunk_size)

[不等待

指示詞放相對應的結構限制 迴圈。具體來說,對應的迴圈必須正式的圖形:

for (init-expr;var 邏輯 op b。  incr-expr)

  • 初始化 expr
    下列其中一項:

    var = lb

    整數型別 var = lb

  • 需要 incr expr
    下列其中一項:

    ++var

    var ++

    -- var

    var --

    var += incr

    var -= incr

    var = var + incr

    var = incr + var

    var = var - incr

  • var
    帶正負號的整數的變數。如果此變數會否則共用,它隱含設定私人的持續期間。這個變數不能修改本文中的陳述式。語言表示) 變數 lastprivate,它是不確定的迴圈之後的值。

  • 邏輯作業
    下列其中一項:

    <

    <=

    >

    >=

  • lb, b, and incr
    循環播放,而異的整數運算式。這些運算式的評估期間沒有同步處理。因此,任何經過評估的副作用會產生不確定的結果。

請注意,標準的格式可以讓來計算在進入迴圈的迴圈反覆運算的次數。這項計算執行中的型別值 var之後整數提升。在特定的如果值為 b - lb + 需要 incr ,因為型別,結果就是不確定無法表示。遠,if 邏輯 op 是 < 或 < = 再需要 incr expr 必須誘使 var 以增加在每次重複迴圈 (loop)。如果邏輯 op 是 > 或 > = 再需要 incr expr 必須誘使 var 可減少在每次重複迴圈 (loop)。

排程 子句會指定如何重複 迴圈小組的執行緒之間劃分。依據程式的正確性必須不是哪一個執行緒執行特定的反覆項目。值為 chunk_size,若有指定,必須是正數值與迴圈而異的整數運算式。這個運算式的評估期間沒有同步處理。因此,任何經過評估的副作用會產生不確定的結果。排程可以是下列其中一項:

[表 2 1 排程 子句 的值

static

排程 (靜態、 chunk_size) 指定反覆項目被切割成區塊 (chunk) 所指定大小的 chunk_size。區塊 (chunk) 以靜態方式指派給執行緒編號的順序循環配置資源方式小組中的執行緒。沒有 chunk_size 指定反覆項目空間畫分成區塊 (chunk) 指派給每個執行緒的一個區塊的大小,大約相同的。

dynamic

排程 (動態的chunk_size) 指定反覆項目分成一系列的區塊 (chunk) 中,每個包含 chunk_size 反覆項目。每個區塊被指派給一個執行緒正在等候工作分派。執行緒執行的反覆項目區塊,並再等待其下一步的工作分派的任何區塊 (chunk) 仍保持為被指派。請注意要指派的最後一個區塊可能會更少的反覆項目。沒有 chunk_size 指定,則其預設值為 1。

「 引導式

排程 (指引, chunk_size) 指定,以減少大小的區塊 (chunk) 中的執行緒指派的反覆項目。當執行緒完成其指定的區塊的反覆項目時,其動態指派另一個區塊,直到沒有任何保留。對於 chunk_size 為 1,每個區塊的大小是大約的未指派的反覆項目除以執行緒數目的數目。這些大小成指數性成長降低約 1 中。對於 chunk_sizek 大於 1,大小減少大約成指數性成長到 k,除了最後一個區塊可能少於 k 反覆項目。沒有 chunk_size 指定,則其預設值為 1。

Runtime - 執行階段

schedule(runtime) 指定,則相關排程會延後執行階段的決策。排程 ,而且區塊 (chunk) 的大小可以選擇在執行階段藉由設定環境變數 OMP_SCHEDULE。如果未設定這個環境變數,則產生的排程是由實作定義。當 schedule(runtime) 指定,則 chunk_size 不能指定。

在沒有明確定義排程 子句、 預設值 排程是由實作定義。

OpenMP 相容的程式不應依賴特定排程正確執行。程式不應依賴排程 符合精確,上面所列的描述為何,因為可以在同一個排程的實作中有變化,所以 跨越不同的編譯器。說明可用來選取排程,以適合特定的情況。

訂購 子句必須要有何時 訂購 指示詞將繫結至 建構。

沒有隱含的屏障,結尾的 建構,除非 [不等待子句所指定。

若要限制指示詞,如下所示是:

  • 迴圈都必須是結構化的區塊中,並另外,其執行必須終止的 中斷陳述式。

  • 迴圈 (loop) 的值控制了運算式的 相關聯的迴圈 指示詞必須是相同的團隊中的所有執行緒。

  • 迴圈反覆運算變數必須為帶正負號的整數型別。

  • 只會有一個排程 子句可以出現在 指示詞。

  • 只會有一個訂購 子句可以出現在 指示詞。

  • 只會有一個 nowait 子句可以出現在指示詞。

  • 未指定的 if 或任一邊效果中的頻率是 chunk_sizelbb,或 需要 incr 運算式會產生。

  • 值為 chunk_size 運算式必須是相同的團隊中的所有執行緒。

交互參照:

  • 私用firstprivatelastprivate,以及 降低 子句,請參閱 區段 2.7.2 在 25] 頁面上。

  • OMP_SCHEDULE 環境變數,請參閱一節 4.1 在 48] 頁面上。

  • 已排序的 建構,請參閱 一節 2.6.6 在 22] 頁面上。

  • 附錄 d,頁面 93,提供更多有關使用排程子句。