pragma omp parallel for 与 pragma omp parallel

pragma omp parallel for vs. pragma omp parallel

在带有 openMP 的 C++ 中,

之间有什么区别吗?
#pragma omp parallel for
for(int i=0; i<N; i++) {
   ...
}

#pragma omp parallel
for(int i=0; i<N; i++) {
   ...
}

?

谢谢!

#pragma omp parallel
for(int i=0; i<N; i++) {
   ...
}

此代码创建一个并行区域,每个单独的线程执行循环中的内容。换句话说,您执行了 N 次完整循环,而不是 N 个线程拆分循环并仅完成一次所有迭代。

你可以这样做:

#pragma omp parallel
{
    #pragma omp for
    for( int i=0; i < N; ++i )
    {
    }

    #pragma omp for
    for( int i=0; i < N; ++i )
    {
    }
}

这将创建一个并行区域(也称为一个 fork/join,这很昂贵,因此您不想为每个循环都这样做)和 运行 在该区域内并行的多个循环.只要确保你已经有一个并行区域,你使用 #pragma omp for 而不是 #pragma omp parrallel for 因为后者意味着你的 N 个线程中的每一个都会产生 N 个线程来执行循环。