编写 OpenMP 部分的方式有哪些区别?
What are the differences between ways of writing OpenMP sections?
使用之间有什么(如果有的话)区别:
#pragma omp parallel
{
#pragma omp for simd
for (int i = 0; i < 100; ++i)
{
c[i] = a[i] ^ b[i];
}
}
和:
#pragma omp parallel for simd
for (int i = 0; i < 100; ++i)
{
c[i] = a[i] ^ b[i];
}
或者编译器(ICC)关心吗?
我知道第一个定义了一个并行部分,而不是一个要划分的 for 循环,你可以在循环后进行多个操作。说的不对请指正,还在学习openmp的方法..
但是你什么时候会使用一种方式呢?
简单地说,如果您只有 1 个要并行化的 for 循环,请使用 #pragma omp parallel for simd
。
如果您想并行化多个 for 循环或在当前 for 循环之前或之后添加任何其他并行例程,请使用:
#pragma omp parallel
{
// Other parallel code
#pragma omp for simd
for (int i = 0; i < 100; ++i)
{
c[i] = a[i] ^ b[i];
}
// Other parallel code
}
这样您就不必在添加更多并行例程时重新打开并行部分,从而减少开销时间。
使用之间有什么(如果有的话)区别:
#pragma omp parallel
{
#pragma omp for simd
for (int i = 0; i < 100; ++i)
{
c[i] = a[i] ^ b[i];
}
}
和:
#pragma omp parallel for simd
for (int i = 0; i < 100; ++i)
{
c[i] = a[i] ^ b[i];
}
或者编译器(ICC)关心吗?
我知道第一个定义了一个并行部分,而不是一个要划分的 for 循环,你可以在循环后进行多个操作。说的不对请指正,还在学习openmp的方法..
但是你什么时候会使用一种方式呢?
简单地说,如果您只有 1 个要并行化的 for 循环,请使用 #pragma omp parallel for simd
。
如果您想并行化多个 for 循环或在当前 for 循环之前或之后添加任何其他并行例程,请使用:
#pragma omp parallel
{
// Other parallel code
#pragma omp for simd
for (int i = 0; i < 100; ++i)
{
c[i] = a[i] ^ b[i];
}
// Other parallel code
}
这样您就不必在添加更多并行例程时重新打开并行部分,从而减少开销时间。