我已经在C ++中实现了一个并行代码,用于使用OPENMP使用Prim的算法查找最小生成树。有时它要快一些(7.95毫秒),但有时我会得到12.7毫秒的速度,这比串行版本(我得到9.69毫秒)要慢得多。这是我的代码的并行版本:
你能帮忙吗?
此外,是否有测试我的代码性能的有效方法?time.h似乎不准确。
非常感谢!
OpenMP的开销会给时间计算增加一个常数项。让我举个例子吧。
假设您的算法以A*n
A为常数并且n为要迭代的项目数结束。我们还假设您的算法完全并行化,因此,如果您有k
线程,则并行化算法会O(n)/k
及时完成。由于OpenMP开销,运行时间将是A*n/k + B
B的开销。因此,为了让您看到来自OpenMP的任何好处A*n/k + B < A*n
。对于n [0,阈值]的某个范围的值,由于开销,OpenMP实际上将比串行算法慢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
足够大,则常数项就微不足道,在这种情况下,阈值无关紧要。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句