我有一个 C++ 程序,它有一个双for循环,我想使用 opeMP 进行并行化。它很简单(多项式乘积),长度可变(系数在 100 到 8000 之间),每次执行调用该函数数百万次。
我pragma在外部循环周围有平行线,而forpragma 就在 pragma 下方parallel。我发现如果元素的数量很大,接近 8000,执行时间很好,低于没有并行化。但是,对于少量的系数,性能会下降,并且并行版本比串行版本慢。
我想这是由于每次调用函数时都会创建/销毁并行线程。我可以在编译指示中限制线程的创建if,所以它只对大多项式进行并行化,但我想知道是否有办法避免线程的创建/销毁,所以我可以创建一次并留下它们“在通话之间等待”,因此他们会在需要时准备好。该函数是我唯一并行化的函数,我无法将并行化移动到调用函数。
我正在使用 g++。