縮減

用途

REDUCTION 子句會更新指引建構內子句所宣告的具名變數。 除了更新項目本身之外, REDUCTION 變數的中間值不會在 平行建構中使用。

語法

讀取語法圖跳過視覺化語法圖 REDUCTION ( op_fnc: variable_name_list )
op_fnc
reduction_opreduction_function ,它會出現在涉及此變數的所有 REDUCTION 陳述式中。 您不得在指引建構中為變數指定多個 REDUCTION 運算子或函數。 若要維護 OpenMP API 相符性,您必須針對 REDUCTION 子句指定 op_fnc
REDUCTION 陳述式可以具有下列其中一種格式:

讀取語法圖跳過視覺化語法圖 reduction_var_ref = expr reduction_op reduction_var_ref

讀取語法圖跳過視覺化語法圖 reduction_var_ref = reduction_var_ref reduction_op expr

讀取語法圖跳過視覺化語法圖 reduction_var_ref = reduction_function (expr , reduction_var_ref)

讀取語法圖跳過視覺化語法圖 reduction_var_ref = reduction_function (reduction_var_ref , expr)
其中:
reduction_var_ref
是出現在 REDUCTION 子句中之變數的變數或子物件
reduction_op
是下列其中一個本質運算子: +-*.AND..OR..EQV..NEQV..XOR.
reduction_op 是本質運算子時,它應該是在右側執行的最後一個作業。
reduction_function
是下列其中一個本質程序: MAXMINIANDIORIEOR
expr
不應包含 reduction_var_ref 的參照

下表顯示每一個運算子和本質的標準起始設定值。 實際起始設定值將與對應 REDUCTION 變數的資料類型一致。

Intrinsic Operator Initialization
+ 0
* 1
- 0
.AND. .TRUE。
. 或。 .FALSE。
.EQV。 .TRUE。
.NEQV。 .FALSE。
.XOR。 .FALSE。
Intrinsic Procedure Initialization
MAX 最小可表示數
MIN 可呈現的最大數目
IAND 所有位元開啟
IOR 0
IEOR 0

規則

下列規則適用於 REDUCTION 陳述式:
  • REDUCTION 子句中的變數只能出現在出現 REDUCTION 子句之指引建構內的 REDUCTION 陳述式中。
  • REDUCTION 陳述式中出現的兩個 reduction_var_ref在詞彙上必須相同。
  • 您無法使用下列形式的 REDUCTION 陳述式: reduction_var_ref = expr operator reduction_var_ref,其中 operatorreduction_op以外的任何運算子。

當您在 REDUCTION 子句中指定共用區塊的個別成員時,所指定變數的儲存體不再與共用區塊的儲存體相關聯。

您在工作共用建構的 REDUCTION 子句中指定的任何變數都必須在含括的 PARALLEL 建構中共用。

出現在平行建構的 REDUCTION 子句中的變數也可以出現在工作共用建構的 PRIVATE 子句中。

如果您在具有 NOWAIT 子句的建構上使用 REDUCTION 子句,則在執行屏障同步化以確保所有執行緒都已完成 REDUCTION 子句之前, REDUCTION 變數會維持未定義。

在建構的動態範圍內, REDUCTION 變數不得出現在另一個建構的 FIRSTPRIVATEPRIVATELASTPRIVATE 子句中,它在該建構中顯示為 REDUCTION 變數。

如果您對 REDUCTION 子句指定 op_fnc ,則 variable_name_list 中的每一個變數都必須是本質類型。 變數只能出現在指引建構的詞彙範圍內的 REDUCTION 陳述式中。 如果指引使用 trigger_constant $OMP,則必須指定 op_fnc

REDUCTION 子句指定出現在縮減作業中的具名變數。 編譯器會維護這類變數的本端副本,但會在結束建構時結合它們。 REDUCTION 變數的中間值會以隨機順序結合,視最先完成其計算的執行緒而定。 因此,不保證會從一個平行執行到另一個平行執行取得位元相同的結果。 即使平行執行使用相同的執行緒數目、排程類型及片段大小,也是如此。

您指定為平行建構 REDUCTIONLASTPRIVATE 的變數會在建構結束時定義。 如果您在多個執行緒上有並行定義或使用 REDUCTIONLASTPRIVATE 變數,當變數變成已定義時,您必須確定在建構結束時,執行緒已同步。 例如,如果多個執行緒遇到具有 REDUCTION 變數的 PARALLEL 建構,則必須在執行緒到達 END PARALLEL 指引時同步化這些執行緒,因為 REDUCTION 變數會在 END PARALLEL中定義。 因此,整個 PARALLEL 建構必須含括在同步化建構中。

如果 REDUCTION 子句上出現可配置陣列,則在進入包含 REDUCTION 子句的建構時,它必須具有已配置的配置狀態。 此外, REDUCTION 變數的專用副本不得在區域內取消配置或配置。

REDUCTION 子句中的變數必須是本質類型。 REDUCTION 子句中的變數或其任何元素不得是下列任何一項:
  • 被任命的人
  • 假設大小陣列
  • THREADLOCAL 共用區塊
  • THREADPRIVATE 共用區塊或其成員
  • THREADPRIVATE 變數
  • 可配置的 純量 物件
  • Fortran 90 指標

這些規則說明在 OpenMP 指引上使用 REDUCTION 。 如果您在 INDEPENDENT 指引上使用 REDUCTION 子句,請參閱 INDEPENDENT 指引。