嵌套并行.For()循环速度和性能
本文关键字:速度 性能 循环 并行 For 嵌套 | 更新日期: 2023-09-27 18:19:51
我有一个嵌套的for循环。我用Parallel.For()
替换了第一个For,计算速度提高了。
我的问题是用Parallel.For()
替换(内部1)的第二个。它会提高速度吗?还是没有区别?还是会慢一点?
编辑:
由于内核不是无限的(通常有2到8个内核),内部环路是并行运行的。所以,如果我用Parallel.For()
改变的内部,它再次并行运行。但我不确定它是如何改变性能和速度的。
摘自.NET并行计算团队的《并行编程模式》一书中的"太细粒度,太粗粒度"小节中的"反模式"部分:
答案是,最佳的平衡是通过性能找到的测试。如果与之相比并行化的开销最小对于正在完成的工作,尽可能多地并行化:在这种情况下,这将意味着并行化两个循环。如果并行化内部循环会降低大多数系统的性能系统,在这样做之前要三思,因为只有使外循环并行化。
请看一下该小节,它包含了并行光线跟踪应用程序的详细示例。它建议使循环变平以获得更好的并行度也可能对您有所帮助。
这同样取决于许多场景,
- cpu可以运行的并行线程数
- 迭代次数
如果你的CPU是单核处理器,你将不会得到任何好处。
如果迭代次数更多,您将得到一些改进。
如果只有几次迭代,它将很慢,因为它涉及额外的过载。
这在很大程度上取决于在for和机器内部使用的数据和函数。我最近一直在摆弄parallel.fo和parallel.foreach,发现它们让我的应用程序变得更慢。。。(在4核机器上,如果你有一台24核服务器,那就另当别论了)
我认为管理线程意味着太多的开销。。。
甚至MS在他们的文档中(这里有一个关于msdn的很长的pdfhttp://www.microsoft.com/download/en/details.aspx?displaylang=en&id=19222)承认这并不能使应用程序运行得更快。你每次都要尝试,如果成功了,那就太好了,如果不是坏运气的话。
你应该尝试外部的for和内部的,但至少在我尝试的应用程序上,它们都没有让应用程序更快。外部还是内部并不重要,我只是得到了相同的执行时间,甚至更糟。
也许如果您也使用并发集合,您可以获得更好的性能。但是,再说一遍,如果不尝试,就无法判断。
编辑:
我刚刚在MSDN上找到了一个很好的链接,它对提高Parallel.foreach性能非常有用(对我来说)http://msdn.microsoft.com/en-us/library/dd560853.aspx