线程(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