C++ 常规openMP-线程速度不同

C++ 常规openMP-线程速度不同,c++,openmp,C++,Openmp,我有一个openMP程序,其中for循环是并行的。 一切都正常工作,除了主线程比其他线程快很多很多倍。。。例如,当使用4个线程运行时,线程0比其他线程早完成,但它们执行的代码相同,工作量几乎相同 这可能是因为Windows处理资源,在程序使用的线程中交换任务,导致速度减慢吗? 还是我的代码更可能是问题所在?我只是想确保我不会浪费时间在我的程序中寻找错误,如果这是操作系统导致的不可避免的问题 Look线程的执行取决于许多因素,因此可能存在许多可能性,比如是否存在任何锁定机制,或者资源可用性,比如当

我有一个openMP程序,其中for循环是并行的。 一切都正常工作,除了主线程比其他线程快很多很多倍。。。例如,当使用4个线程运行时,线程0比其他线程早完成,但它们执行的代码相同,工作量几乎相同

这可能是因为Windows处理资源,在程序使用的线程中交换任务,导致速度减慢吗?
还是我的代码更可能是问题所在?我只是想确保我不会浪费时间在我的程序中寻找错误,如果这是操作系统导致的不可避免的问题

Look线程的执行取决于许多因素,因此可能存在许多可能性,比如是否存在任何锁定机制,或者资源可用性,比如当线程完成任务时,它必须释放资源。还有更多的因素。因此,我建议您使用一个名为vtune的工具来评测代码,这样您就可以清楚地知道线程在哪里浪费时间,以及为什么要浪费时间。我希望这会有所帮助。

至于为什么线程具有优先级,这可能是OpenMP运行时和操作系统之间的问题。您使用的是哪种编译器?如何测量螺纹何时终止


在本例中,为了提高OpenMP并行程序的性能,我将在指令中使用动态调度策略。如果主线程从CPU获得更多的周期,那么在这种情况下它也会做更多的工作。一般来说,你不能指望每个线程的速度都一样快,但是如果你观察到了数量级的差异,这听起来像是运行时和操作系统之间的严重冲突。

如果没有任何真正的代码暴露,很难说是什么导致了不好的行为。不过,如果你想参考看。我想我有太多的代码,它是有用的张贴。。。问题其实是关于openMP的一般行为:每个线程的速度是否都一样快?除非您花时间将代码提取到基本元素,而不丢弃重要部分,否则您的问题可能会结束。谢谢,这就是我一直在寻找的答案。。。事实证明,经过一些实验,很明显,在后台操作系统中运行的进程越少,线程的运行就越均匀。当使用所有可用的内核时,其中一个线程的速度总是明显较慢。我将在一台超级计算机上的一个节点上测试这一点,该节点有32个核,当它没有使用大量资源运行大型操作系统时,看看性能是否更加一致。在争用方面,您还应该注意进程绑定。让线程保持完全相同的速度可能并不总是可行的,因此我建议考虑在OpenMP中进行动态调度。