为了账号安全,请及时绑定邮箱和手机立即绑定

并行回路性能下降

并行回路性能下降

C#
鸿蒙传说 2021-04-05 17:14:46
我目前正在优化用于并行执行的数据处理逻辑。我注意到,随着核心数量的增加-数据处理性能并不一定会增加我认为应该的方式。结果如下:从结果集中可以看到,通过使用2个内核而不是1个内核,您可以获得几乎理想的性能提升(事实是,其中1个内核在运行4700Mhz,而4600Mhz每个2个内核在运行)。此后,当应该在3个内核上并行处理数据时,我预计与2个内核执行相比,性能将提高33%。实际增长21.62%。接下来,随着核心数量的增加-“并行”执行性能的下降持续增加。最后,当我们有12个核心结果时-actual与ideal结果之间的差异是原来的两倍多(96442ms与39610ms)!我当然没想到差异会如此之大。我有一个Intel 8700k处理器。6个物理核心和6个逻辑核心-共有12个线程。1个内核以Turbo模式,2C 4600、3C 4500、4C 4400、5-6C 4400、6C 4300在Turbo模式下以4700Mhz运行。如果很重要-我在以下地方做了其他观察Core-temp:当1个核心处理正在运行时-6个核心中有1个繁忙50%当2个核心处理正在运行时-6个核心中有2个繁忙50%当运行3个核心处理时-6个核心中有3个繁忙50%当4个核心处理正在运行时-6个核心中有4个繁忙50%当5个核心处理正在运行时-6个核心中有5个繁忙50%当6个核心处理正在运行时-6个核心中有6个繁忙50%当7个核心处理正在运行时-6个核心中有5个繁忙50%,1个核心100%当8个核心处理正在运行时-6个核心中有4个繁忙50%,2个核心100%当9个核心处理正在运行时-6个核心中有3个繁忙50%,3个核心100%当运行10个核心处理时-6个核心中有2个繁忙50%,4个核心100%当11个核心处理正在运行时-6个核心中有1个繁忙50%,5个核心100%当运行12个核心处理时-所有6个核心的运行率均为100%我当然可以看到最终结果不应该像ideal结果那样好,因为每个内核的频率降低了,但是仍然如此。.是否有很好的解释说明为什么我的代码在12个内核上的性能如此差?这是每台计算机上的普遍情况,还是PC的局限性?
查看完整描述

2 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

是的,Ahmdahl定律。性能提升永远不会与引发问题的内核数量成线性关系。

还互惠...


查看完整回答
反对 回复 2021-04-17
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

无论您有多少个处理器,您的分块代码都将运行一次,但是它仍然取决于处理器的数量。

特别是Skip/Take部分后跟两次ToArray()调用似乎非常需要优化。请参见如何在C#中将数组的一部分复制到另一个数组?有关如何复制数组而不遍历整个对象的知识。

这应该会使您的性能更接近您的预期。也就是说,分支和组合结果的工作将始终降低并行执行的性能。“最大并行度”并非完全值得争夺。总有一个最好的地方,那就是并行化要比为它做准备好得多。您需要找到它。或者让.NET通过忽略内核的手动替代来解决这一问题。


查看完整回答
反对 回复 2021-04-17
  • 2 回答
  • 0 关注
  • 149 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信