OpenMP并行编程基于线程数与执行时间的关系

时间:2018-03-14 05:32:54

标签: c++ c parallel-processing openmp

我在Visual Studio 2010中有以下代码:

#pragma omp parallel for num_threads(1)
for(int y=0;y<col;y++)
bands[parametersnumberPredictionBands+1][x][y] = hyperspectral[x][y][z];

当num_threads(1)小于num_threads(3)时执行代码所花费的时间。

据我所知,当并行使用更多线程时,应该减少所花费的时间。任何人都可以解释原因吗?

我是初学者,所以非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

创建和销毁线程需要一些时间。当每个线程完成的工作很简单时,创建和销毁线程所花费的时间就超过了完成工作所需的时间。

而是尝试运行类似

的内容
git push --force --mirror

由于完成的工作量超过了创建和销毁每个线程的工作量,因此3个线程所花费的时间将大大减少。

也许更清楚地看到这个例子会有所帮助。假设我们要并行化一个迭代10次的循环,每次迭代需要1秒,每个额外的线程创建需要0.5秒。

单个线程将在10秒内完成任务。如果我们创建另一个线程,则工作时间可以分成两半,结果只需5秒钟。但创建额外线程需要0.5秒,因此总运行时间为5.5秒。它仍然比原来快,但将线程数增加一倍并不是我们运行时间的一半

让我们说我们想要非常快地运行我们的循环,并且我们为总共10个线程创建了9个额外的线程。现在可以在所有10个线程中分配工作时间,从而产生1秒的工作。但是,创建9个线程需要4.5秒。我们的总运行时间现在是5.5秒,这与仅使用2个线程的运行时相同!创建线程的开销超过了要完成的工作量。此时继续添加线程只会减慢我们的程序。

基本上所有具有固定工作量的程序都有一点,其中更多线程不会加快运行时间。大型工作负载超过了为大量线程创建线程的成本。线程创建开销几乎立即使小工作负载相形见绌。

TL; DR

并行性最适合大问题。并行化琐碎的问题只会让它们变慢。