C ++ OpenMP并行比串行慢

时间:2014-02-15 10:06:00

标签: c++ optimization graph parallel-processing openmp

我在C ++中实现了一个并行代码,用于使用OPENMP查找Prim算法的最小生成树。有时候它会快一点(7.95毫秒),但有时我的速度提高了12.7毫秒,这比串行版本要快得多(我得到了9.69毫秒) 这里有我的代码的并行版本:

https://dpaste.de/dUt6

你可以帮帮忙吗?

此外,是否有一种有效的方法来测试我的代码的性能? time.h似乎不准确。

非常感谢!

1 个答案:

答案 0 :(得分:4)

OpenMP有一个开销,它为时间计算添加一个常量项。让我举个例子。

假设您的算法在A*n中完成,其中A是常量,n是您将迭代的项目数。我们还假设您的算法完美并行化,这样如果您有k个线程,并行算法将在O(n)/k时间内完成。由于OpenMP开销,运行时间为A*n/k + B,其中B是开销。因此,为了让您从OpenMP A*n/k + B < A*n中看到任何有用的功能。对于某些范围的n [0,阈值],由于开销B,OpenMP实际上比串行算法慢。

另一个重点是OpenMP具有不同的开销/阈值,具体取决于它是否已在代码中使用。我称之为寒冷和温暖的门槛。

dtime_cold = omp_get_wtime();
foo();  //cold  - OpenMP has not been called before
dtime_cold = omp_get_wtime() - dtime_cold;

dtime_warm = omp_get_wtime();
foo(); //warm - OpenMP has already been called once
dtime_warm = omp_get_wtime() - dtime_warm;

如果n足够大,则常数项无关紧要,在这种情况下,阈值无关紧要。