如何使用OpenMP在omp单中嵌套omp

时间:2011-05-05 15:09:28

标签: c openmp parallel-processing

我有一个for循环,我不想并行化,它调用一个我想要并行化的函数(其中有一个我要并行化的for循环)。我想把并行区域放在整个批次之外,这样我的线程只会被创建一次(以减少线程创建的开销)。

但是,目前我有omp single覆盖for循环,它调用函数并在函数内部omp for处理内部for循环。它是动手,根据OMP single hangs inside for,这是因为这样做是非法的!

如果我不能这样做,我该如何处理呢?我想确保只有一个线程运行外部for循环并调用该函数,但是在函数内部我可以获得完全并行性。

这可能吗?有什么想法吗?

2 个答案:

答案 0 :(得分:1)

大多数实现只创建一次线程 - 在程序启动时或遇到第一个并行区域时。一旦创建,它们通常不会被销毁,而是在遇到并行区域结束时放入一个空闲的线程池(由OpenMP实现处理)。这意味着您应该能够将并行区域放在循环中,并且每次遇到并行区域时都不会产生线程创建开销。每次遇到并行区域时都会有一些小的开销,但比创建线程时要小得多。

答案 1 :(得分:0)

怎么样:   - 将你的内循环放在#pragma omp parallel中   - 在外循环之前将活动线程数设置为1   - 在调用其他功能之前将其设置回N.   - 在函数

中加入#pragma omp

并行部分在OMP中的函数边界上是瞬态的,并且设置活动线程的数量不应该太有害。不过需要进行测试/基准测试。