它不仅仅是语法糖。 OpenMP 所追求的特性之一是,如果代码不是用 OpenMP 编译的,则不会更改串行代码。如果您不使用 OpenMP 进行编译,则用作编译指示一部分的任何构造都会被忽略。这样做你可以使用类似的东西private
, firstprivaate
, collapse
, and parallel for
无需更改您的代码。更改代码可能会影响编译器优化代码的方式等。
如果你有类似的代码
int i,j;
#pragma omp parallel for private(j)
for(i = 0; i < n; i++) {
for(j = 0; j < n; j++) {
}
}
做到这一点的唯一方法,无需private
in C89
就是通过定义来改变代码j
在平行部分内,例如:
int i,j;
#pragma omp parallel
{
int j;
#pragma omp for
for(i = 0; i < n; i++) {
for(j = 0; j < n; j++) {
}
}
}
这是一个 C++ 示例firstprivate
。假设您有一个想要保密的向量。如果你使用firstprivate
您不必更改代码,但如果您在并行区域内声明私有副本,则需要更改代码。如果您在没有 OpenMP 的情况下对其进行编译,则会生成不必要的副本。
vector<int> a;
#pragma omp parallel {
vector<int> a_private = a;
}
这种逻辑适用于许多其他结构。例如collapse
。您可以手动融合一个循环来更改您的代码,或者您可以使用collapse
并且仅在使用 OpenMP 编译时融合它。
然而,话虽如此,在实践中,我经常发现无论如何我都需要更改代码才能获得最佳并行结果,因此我通常在并行部分中定义所有内容,并且不使用诸如private
, firstprivate
, or collapse
(更不用说 OpenMP 在 C++ 中的实现经常遇到困难反正非 POD所以通常最好自己做)。