多线程CPU密集型任务在温度限制之前限制CPU的方式


21

我编写了一个非常占用CPU的线程任务,该任务可以在我的2012 MacBook Pro四核上正常运行。我用20个线程将其松开,并且使用英特尔Power Gadget测得的温度最高达到约100°C,而节流效果却很小。

将相同的程序和数据文件带到配备双核计算机的2016 13英寸MacBook Pro上,然后启动它,我希望它还能保持3.3-3.4 GHz的温度,直到温度接近100°C。上面的命令以350%的速度显示任务(每个双线程2个内核),但是CPU温度被降低到1.6-1-8 GHz,温度仅在60°C左右,而风扇则安静下来。如果我单独启动4个在执行单线程CPU任务时,机器在保持3.3-3.4 GHz的频率下达到预期的性能,直到达到100°C,风扇开始转动;问题是为什么我的CPU被节流?

两台机器都是最新的,并运行相同版本的gcc。如果我什至从工作机上获取二进制文件并将其放在2016 Mac上,它也会遇到同样的问题。

如果我运行3个或4个CPU单线程,以使计算机全速运行,然后启动线程程序,它也会降低频率。

两台机器都有16 GB的RAM。

编辑

在玩完代码后,我怀疑当任务创建太多线程时,它会受到限制。在此程序中,我将读取所有记录,并为其创建一个线程。我一次只允许20个左右的线程通过,因此在任何时候都不会有超过21个线程,但是有14,400,000条记录需要处理,因此在30分钟左右的时间内,每个记录都将由一个单独的线程处理。

我创建了一个琐碎的pthread程序,该程序消耗CPU时间并设置其中10个运行。有问题的笔记本电脑可以正常运行,并且可以预热到95C。

我想我将重写代码以重用同一线程,而不是销毁它们并重新启动它们。

更新5/13/17

经过几个小时的工作,它现在仅创建n个线程并仅重用它们,这无济于事。除了CPU温度,什么会导致本机减速?


1
我喜欢这个问题!如何运行其他特定的多线程任务?我建议运行类似ffmpeg的任务(在1080p或4K视频上,以确保它使用了所有可用的CPU资源),然后查看它是否停止运行。这可能将问题缩小为:该计算机上的程序或该计算机上的所有多线程程序
NoahL

1
如果我运行Cinebench R15基准测试,它将使用线程化任务并按预期运行,温度升至约100C,风扇上升。Intel Power Gadget显示CPU频率仍接近3.3Ghz。因此,它看起来不像是硬件问题。所有的代码都是C代码,没有使用p_threads和最小的Mutex锁的幻想。该程序主要是DNA序列处理,其中一个线程提取大约16 gig的数据,然后将其传递给n个单独的线程进行大量运算。
markatlnk

1
看起来其他程序可以达到您的目标?如果问题仅来自您的特殊代码,我们可能需要有关该代码的更多信息。但是,您的数据将在哪里处理?外部?kernel_task报告多少工作?其他温度传感器?
LаngLаngС

1
您的CPU有8个逻辑核心,而不是4个,因此4个线程将显示为CPU总使用率的50%。我想知道这是否会影响系统的负载估计。
sudo

我不知道您是否要解决麻烦,但是您可以尝试使用调试内核在内核级别进行调试。如果您在Apple开发者网站上单击更多下载内容,则可以获得此信息。
user3052786 '18

Answers:


1

这可能是一个漫长的过程,但也许2012年和2016年cpu软件包之间的单核性能和/或缓存性能之间的差异足够大,以致于内核会出现数据匮乏和节流的状况,直到它们可以再次工作?

我之所以这么猜测,是因为您表示有足够的​​单线程进程可以在所有内核上全速运行,而一个简单的多线程程序可以在所有内核上全速运行。

这使我认为您的实际工作负载与测试多线程工作负载的程序设计中存在某些问题,这些问题无法让CPU一直工作


0

内核扩展/System/Library/Extensions/AppleACPIPlatform.kext控制许多温度和CPU防护措施。显然,它已经在您的系统上进行了编译,但是可能可以在https://opensource.apple.com上找到(我找不到它,但是我只是快速浏览了一下)。如果Apple在CPU能力方面设置得非常保守,那也不会令我感到惊讶。


3
AFAIK Apple Kexts不是开源的。(奇怪吗?)关于此信息的最佳资源是Hackintoshing社区,因为需要注入驱动程序。
JMY1000 '17

一点都不奇怪!修补匠会提供最佳建议,因为他们比第一手要了解得多。至于保守的CPU设置,请记住,MBP具有出色的散热性能,可提高突发性能,但对于持续循环而言则不那么好。这个问题很可能归因于苹果公司想要先发制人地防止腿部被煮熟。我听说有关2012MBP的一些诉讼。
user1901982 '18

0

每当操作系统将线程识别为不可预测的并且失去控制时,它将降低速度以保持硬件和系统的稳定性,2012模型的行为会有所不同,在最坏的情况下可能会锁定。发生在我执行不当的线程控制上是我的错。只是不要在双核上运行那么多线程。


-2

发生在我执行不当的线程控制上是我的错。只是不要在双核CPU上运行太多线程。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.