自动并行化和自动Vectorization

自动 Parallelizer 和自动 Vectorizer 设计为在代码中循环提供自动性能提升。

自动 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 increase(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(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(loop(no_vector)) 还支持。

对于自动 Parallelizer,可以指定 /Qvec-report (Auto-Vectorizer Reporting Level) 命令行选项成功地报告或向量化循环只**/Qvec-report:1**(或成功和未成功向量化循环**/Qvec-report:2**)。

有关原因代码和消息的更多信息,请参见 Vectorizer and Parallelizer Messages

有关演示如何 vectorizer 的示例实际上讲,请参见 项目奥斯汀第 2 部分的 6:当页

请参见

参考

loop

/Qpar(自动并行化)

/Qpar-report (Auto-Parallelizer Reporting Level)

/Qvec-report (Auto-Vectorizer Reporting Level)

其他资源

并行编程方式在本机代码

Vectorizer and Parallelizer Messages