我有一个for循环,我不想并行化,它调用一个我想要并行化的函数(其中有一个我要并行化的for循环)。我想把并行区域放在整个批次之外,这样我的线程只会被创建一次(以减少线程创建的开销)。
但是,目前我有omp single
覆盖for循环,它调用函数并在函数内部omp for
处理内部for循环。它是动手,根据OMP single hangs inside for,这是因为这样做是非法的!
如果我不能这样做,我该如何处理呢?我想确保只有一个线程运行外部for循环并调用该函数,但是在函数内部我可以获得完全并行性。
这可能吗?有什么想法吗?
答案 0 :(得分:1)
大多数实现只创建一次线程 - 在程序启动时或遇到第一个并行区域时。一旦创建,它们通常不会被销毁,而是在遇到并行区域结束时放入一个空闲的线程池(由OpenMP实现处理)。这意味着您应该能够将并行区域放在循环中,并且每次遇到并行区域时都不会产生线程创建开销。每次遇到并行区域时都会有一些小的开销,但比创建线程时要小得多。
答案 1 :(得分:0)
怎么样: - 将你的内循环放在#pragma omp parallel中 - 在外循环之前将活动线程数设置为1 - 在调用其他功能之前将其设置回N. - 在函数
中加入#pragma omp
并行部分在OMP中的函数边界上是瞬态的,并且设置活动线程的数量不应该太有害。不过需要进行测试/基准测试。