OpenMP - 并行区域中的串行for循环,包含并行for循环

时间:2017-11-24 14:54:44

标签: c multithreading openmp

我向this chap提出了一个非常相似的问题,但那里只有一个答案,但对我来说并没有用。

我在main()中有一个并行区域,其中一个for循环调用函数new_value()

int main(int argc, char** argv)
{
    omp_set_num_threads(4);

#pragma omp parallel default(shared) private(...)
{
    for(int i = 0; i < MAX_VALUE; i++)
        new_value(...);
}

    return 0;
}

new_value()看起来像:

void new_value(...)
{
#pragma omp for schedule(static, chunk_width)
    for(int i = 0; i < N; i++)
        arr[i] = update();
}

我遇到的问题是我不希望main()中的for循环被并行化(即总共运行MAX_VALUE * 4次)。

我基本上希望一个循环可以串行运行,但new_value()中的for循环可以用四个线程运行。

我在循环之前尝试了#pragma omp single,但它导致程序死锁或挂起。我也尝试了已经linked线程建议的嵌套并行方法,但我得到了相同的结果。

任何解决方案都将受到赞赏。

1 个答案:

答案 0 :(得分:1)

嗯,你有点过分复杂了。试试这个:

void new_value(...){
#pragma omp parallel for num_threads(4)
    for(int i = 0; i < N; i++)
        arr[i] = update();
}

int main(int argc, char** argv){
    for(int i = 0; i < MAX_VALUE; i++)
        new_value(...);
    return 0;
}