Une tâche gourmande en CPU à plusieurs threads limite le processeur bien avant les températures limites


21

J'ai écrit une tâche filetée très gourmande en processeur qui fonctionne comme prévu sur mon quad core MacBook Pro 2012. Je le lâche avec 20 fils et les températures atteignent environ 100 ° C, mesurées avec Intel Power Gadget avec un étranglement minimal.

Apportez le même programme et les mêmes fichiers de données à mon MacBook Pro 13 "2016 avec une machine double cœur et démarrez-le, je m'attendrais à ce qu'il maintienne également les 3,3 à 3,4 GHz jusqu'à ce que la température atteigne la barre des 100 ° C. La commande supérieure montre la tâche à 350% (2 cœurs chacun à double thread), mais la fréquence du processeur est réduite à 1,6-1-8 GHz avec la température uniquement à 60 ° C environ avec les ventilateurs complètement silencieux. Si je démarre 4 séparés tâches de processeur à un seul thread, la machine se comporte comme prévu avec une fréquence de 3,3 à 3,4 GHz jusqu'à ce qu'elle atteigne les 100 ° C et que les ventilateurs démarrent. La question est pourquoi mon processeur est-il étranglé?

Les deux machines sont à jour et exécutent les mêmes versions de gcc. Si je prends même le binaire de la machine qui fonctionne et que je le mets sur le Mac 2016, il a le même problème.

Si j'exécute 3 ou 4 threads CPU uniques pour que la machine fonctionne à pleine vitesse, puis démarre le programme threadé, cela ralentit également la fréquence.

Les deux machines ont 16 Go de RAM.

modifier

Après avoir joué avec le code, je soupçonne qu'il est étranglé lorsqu'une tâche crée trop de threads. Dans ce programme, je prends chaque enregistrement que j'ai lu et je crée un fil pour celui-ci. Je ne laisse passer qu'une vingtaine de threads à la fois, donc à aucun moment il n'y a plus de 21 threads, mais il y a 14.400.000 enregistrements à traiter, donc au cours des 30 minutes environ, chacun de ces enregistrements sera traité par un thread séparé.

J'ai créé un programme pthread trivial qui aspirait le temps CPU et en mettait 10 en marche. L'ordinateur portable à problème a exécuté cela et s'est réchauffé à 95 ° C sans problème.

Je suppose que je vais réécrire mon code pour réutiliser le même thread au lieu de les détruire et de les redémarrer.

Mise à jour 13/05/17

Après plusieurs heures de travail, il ne crée plus que n threads et les réutilise, cela n'a pas aidé. À part la température du processeur, qu'est-ce qui fera que cette machine s'étranglera?


1
J'adore cette question! Que diriez-vous d'exécuter une autre tâche multithread spécifique? Je suggère d'exécuter quelque chose comme une tâche ffmpeg (sur une vidéo 1080p ou 4K, pour vous assurer qu'elle utilise toutes les ressources de processeur disponibles) et voir si elle se réduit. Cela pourrait réduire le problème à: votre programme dans cette machine ou tous les programmes multithreads sur cette machine
NoahL

1
Si je lance le benchmark Cinebench R15, il utilise les tâches filetées et fonctionne comme prévu, la température monte à environ 100 ° C et les ventilateurs montent. Intel Power Gadget montre que la fréquence du processeur est toujours proche de 3,3 GHz. Cela ne ressemble donc pas à un problème matériel. Tout le code est juste du code C avec rien de spécial à utiliser p_threads et des verrous Mutex minimaux. Le programme est principalement un traitement de séquence d'ADN avec un thread qui récupère quelque chose comme 16 gig de données et le transmet à n threads individuels pour le calcul des nombres lourds.
markatlnk

1
Cela ressemble à d'autres programmes peuvent atteindre le plafond que vous visez? Si le problème provient uniquement de votre code spécial, nous pourrions avoir besoin de plus d'informations sur ce code. Cependant, où vos données doivent-elles être traitées? Externe? Quelle quantité de travail est rapportée par kernel_task? D'autres capteurs de température?
LаngLаngС

1
Votre CPU a 8 cœurs logiques, pas 4, donc 4 threads afficheraient une utilisation totale de 50% du CPU. Je me demande si cela affecte l'estimation de la charge de votre système.
sudo

Je ne sais pas si vous souhaitez passer par le problème, mais vous pouvez plutôt essayer de déboguer au niveau du noyau avec le noyau de débogage. Vous pouvez l'obtenir si vous cliquez sur plus dans les téléchargements sur le site de développement Apple.
user3052786

Réponses:


1

Cela peut être long, mais peut-être que la différence de performances monocœur et / ou de performances de cache entre les packages de processeurs 2012 et 2016 est suffisamment grande pour que les cœurs soient privés de données et se réduisent jusqu'à ce qu'ils soient capables de fonctionner à nouveau?

Je fais cette supposition parce que vous indiquez que suffisamment de processus à un seul thread peuvent fonctionner à pleine vitesse sur tous les cœurs, et qu'un simple programme multi-thread peut exécuter à pleine vitesse sur tous les cœurs.

Cela me fait penser qu'il y a quelque chose dans la conception du programme de votre charge de travail réelle par rapport à la charge de travail multi-thread de test qui ne permet pas aux CPU de fonctionner tout le temps


0

L'extension du noyau /System/Library/Extensions/AppleACPIPlatform.kext contrôle de nombreuses protections de température et de CPU. Il est déjà compilé, bien sûr, sur votre système, mais il peut être disponible sur https://opensource.apple.com (je ne le trouve pas, mais je ne lui ai donné qu'un bref aperçu). Cela ne me surprendrait pas si Apple avait des paramètres très conservateurs sur la capacité du processeur.


3
AFAIK les kexts d'Apple ne sont pas open source. (Étrangement?) La meilleure ressource pour obtenir des informations à ce sujet est la communauté Hackintoshing en raison de la nécessité d'injecter des pilotes.
JMY1000

Pas étrange du tout! Les bricoleurs donnent les meilleurs conseils car ils en savent beaucoup plus qu'ils ne le devraient. En ce qui concerne les paramètres CPU conservateurs, n'oubliez pas que le MBP a un excellent dissipateur thermique pour les performances en rafale, mais pas si bien pour les cycles prolongés. Il est fort probable que ce problème soit dû au fait qu'Apple souhaite empêcher préventivement la cuisson de vos jambes. J'ai entendu parler de quelques poursuites judiciaires à ce sujet avec le 2012MBP.
user1901982

0

Chaque fois que le système d'exploitation reconnaît les threads comme imprévisibles et hors de contrôle, il se réduira pour rester stable sur le plan matériel et système, le modèle 2012 se comporte différemment et pourrait se bloquer dans le pire des cas. Cela m'est arrivé avec un contrôle de thread mal implémenté, ma faute. Il suffit de ne pas exécuter autant de threads sur un double cœur.


-2

Cela m'est arrivé avec un contrôle de thread mal implémenté, ma faute. Il suffit de ne pas exécuter trop de threads sur un processeur dual core.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.