线程(1)执行的速度比没有OpenMP快

我在各种情况下运行我的代码,导致我认为是奇怪的行为。 我的测试是使用HT的双核英特尔至强处理器。

没有OpenMP'#pragma'语句,总运行时间= 507秒

使用OpenMP'#pragma'语句指定1个内核,总运行时间= 117秒

使用OpenMP'#pragma'语句指定2个核心,总​​运行时间= 150秒

使用OpenMP'#pragma'语句指定3个核心,总​​运行时间= 157秒

使用OpenMP'#pragma'语句指定4个核心,总​​运行时间= 144秒

我想我无法弄清楚为什么注释掉我的openmp行使程序在1个没有openmp的线程和1个带有openmp的线程之间变慢。

我正在改变的是:

//#pragma omp parallel for shared(segs) private(i, j, p_hough) num_threads(1) schedule(guided)

and...

#pragma omp parallel for shared(segs) private(i, j, p_hough) num_threads(1,2,3,4) schedule(guided)

无论如何,如果任何人有任何想法,为什么这可能会发生,请让我知道!

谢谢你的帮助,

布雷特

编辑:我会在这里解释一些评论

我正在使用num_threads(1),num_threads(2)等。

经过进一步调查,事实证明,根据代码中是否包含“计划(指导)”行,我的结果不一致。

- 当我使用计划(引导)线时,无论线程数量多少,我都会生成最快的解决方案。 - 当我使用默认的调度程序时,我的结果显着变慢并且值不同 - 随着线程数的增加,无法获得进度(指导)改进 - 如果没有调度(指导),我可以通过添加线程

我想我没有找到足够好的关于什么时间表(指导)为我做的描述,我知道它试图分割循环,以便最先进行最耗时的迭代,这应该至少有一个效果一个线程等待其他人完成迭代的时间量。

看起来,对于我的〜900迭代循环,当我使用时间表(指导)时,我只处理〜200次迭代,在没有时间表(指导)的情况下,我正在处理所有900次迭代。 有什么想法吗?


OpenMP具有重要的同步开销。 我发现除非你有一个非常大的循环,并且没有很多工作,并且没有内部循环同步,否则使用OpenMP通常是不值得的。

我认为,当您将线程数设置为一(1)时,OpenMP只是对实施该循环的OpenMP过程执行过程调用,因此开销很小,性能与非OpenMP情况基本相同。

否则,我认为OpenMP会设置一些信号量,等待“worker”线程唤醒,同步它们对数据结构的访问,告诉它们要设置什么样的循环参数,然后调用执行工作的例程,以及当它们完成工作,他们再次发出主线程信号。 这种同步必须发生在一个线程所做的每个工作块上,同步成本并不是微不足道的。

使用STATIC调度选项可以帮助减少调度/同步开销,特别是如果循环迭代次数相对于核心数量较大。

链接地址: http://www.djcxy.com/p/79227.html

上一篇: threads(1) executes faster than no OpenMP

下一篇: c# how to convert float to int