共用方式為


自動平行處理,並自動向量化

自動 Parallelizer 和自動 Vectorizer 設計提供自動增進效能 for 迴圈在自己的程式碼。

自動 Parallelizer

/Qpar 編譯器參數啟用迴圈 自動平行 程式碼。 當您指定這個旗標時,不會變更現有的程式碼,編譯器便會評估程式碼尋找可能會因平行化迴圈。 因為它會發現未完成工作也不會具備平行迴圈,,和,因為每個必要的平行處理可能造成將經常會降低效能而非改善處理產生執行緒集區,額外同步或其他,編譯器是傳統的選取它平行化迴圈。 例如,請考慮迴圈上限不在編譯階段為已知。下列範例:

void loop_test(int u) {
   for (int i=0; i<u; ++i)
      A[i] = B[i] * C[i];
}

由於 u 可能是較小的值,編譯器不會自動平行處理這個迴圈。 不過,您可能仍然需要平行處理了,因為您知道 u 永遠都是大。 若要啟用自動平行化作業,請指定 #pragma 迴圈 (hint_parallel (n)), n 是平行執行緒的數目。 在下列範例中,編譯器會嘗試平行處理跨 8 個執行緒的迴圈。

void loop_test(int u) {
#pragma loop(hint_parallel(8))
   for (int i=0; i<u; ++i)
      A[i] = B[i] * C[i];
}

與所有 pragma 指示詞,替代 Pragma 語法 __pragma(loop(hint_parallel(n))) 也支援。

讓編譯器無法平行化有些迴圈,即使您想要它。 這個範例:

#pragma loop(hint_parallel(8))
for (int i=0; i<upper_bound(); ++i)
    A[i] = B[i] * C[i];

在呼叫函式時, upper_bound() 可能會變更。 由於這個上限不知道,編譯器可能會發出說明的診斷訊息它為何無法平行處理這個迴圈。 下列範例示範可以平行處理的迴圈,無法平行處理的迴圈,編譯器語法在命令提示字元中使用和輸出的編譯器會為每個命令列選項:

int A[1000];
void test() {
#pragma loop(hint_parallel(0))
    for (int i=0; i<1000; ++i) {
        A[i] = A[i] + 1;
    }

    for (int i=1000; i<2000; ++i) {
        A[i] = A[i] + 1;
    }
}

編譯使用這個命令:

cl d:\myproject\mylooptest.cpp /O2 /Qpar /Qpar-report:1

產生這個輸出:

--- Analyzing function: void __cdecl test(void)
d:\myproject\mytest.cpp(4) : loop parallelized

編譯使用這個命令:

cl d:\myproject\mylooptest.cpp /O2 /Qpar /Qpar-report:2

產生這個輸出:

--- Analyzing function: void __cdecl test(void)
d:\myproject\mytest.cpp(4) : loop parallelized
d:\myproject\mytest.cpp(4) : loop not parallelized due to reason '1008'

請注意在輸出的差異兩個不同的 /Qpar-report (Auto-Parallelizer Reporting Level) 選項之間。 /Qpar-report:1 輸出 parallelizer 成功地僅平行處理的訊息迴圈。 /Qpar-report:2 輸出成功和不成功的迴圈平行化 parallelizer 訊息。

如需錯誤代碼和訊息的詳細資訊,請參閱 Vectorizer and Parallelizer Messages

自動 Vectorizer

如果可以,則會 Vectorizer 在您的電腦上分析迴圈在自己的程式碼,並使用向量暫存器和指示執行它們。 這能提高程式碼的效能。 編譯器針對 Intel 或 AMD 處理器的 SSE2 指令或在 ARM 處理器的霓虹指示。 自動 Vectorizer 也使用越 + 新, SSE4.2 指令集,如果電腦支援它。

根據預設,自動 Vectorizer 啟用。 如果您要比較您的程式碼效能。vectorization 下,您可以使用 #pragma 迴圈 (no_vector) 停用任何重複的 vectorization。

#pragma loop(no_vector)
for (int i = 0; i < 1000; ++i)
   A[i] = B[i] + C[i];

與所有 pragma 指示詞,替代 Pragma 語法 __pragma(loop(no_vector)) 也支援。

使用自動 Parallelizer,您可以指定 /Qvec-report (Auto-Vectorizer Reporting Level) 命令列選項成功報告或向量化迴圈只**/Qvec-report:1**) 或成功和不成功向量化圈**/Qvec-report:2**)。

如需錯誤代碼和訊息的詳細資訊,請參閱 Vectorizer and Parallelizer Messages

如需顯示 vectorizer 方式的範例實務上運作,請參閱 專案斯汀 Outlook 第 2 部分的 6:網頁會使用

請參閱

參考

loop

/Qpar (自動平行化工具)

/Qpar-report (Auto-Parallelizer Reporting Level)

/Qvec-report (Auto-Vectorizer Reporting Level)

其他資源

平行程式設計是機器碼

Vectorizer and Parallelizer Messages