He escrito una tarea con subprocesos muy intensiva de CPU que funciona como se esperaba en mi MacBook Pro quad core 2012. Lo desabrocho con 20 hilos y las temperaturas alcanzan aproximadamente los 100 ° C, medido con Intel Power Gadget con un mínimo estrangulamiento.
Lleve el mismo programa y archivos de datos a mi MacBook Pro de 13 "2016 con una máquina de doble núcleo e inícielo, esperaría que también mantuviera los 3.3-3.4 GHz hasta que la temperatura se acerque a la marca de 100 ° C. El comando superior muestra la tarea al 350% (2 núcleos cada uno con doble rosca), pero la frecuencia de la CPU se reduce a 1.6-1-8 GHz con la temperatura solo a 60 ° C más o menos con los ventiladores en silencio. Si comienzo 4 por separado tareas de CPU de un solo subproceso, la máquina se comporta como se espera, manteniendo los 3.3-3.4 GHz hasta que alcanza los 100 ° C y los ventiladores se ponen en marcha. La pregunta es ¿por qué mi CPU está siendo acelerada?
Ambas máquinas están actualizadas y ejecutan las mismas versiones de gcc. Si incluso tomo el binario de la máquina en funcionamiento y lo pongo en la Mac 2016, tiene el mismo problema.
Si ejecuto 3 o 4 subprocesos simples de la CPU para que la máquina funcione a toda velocidad, luego inicio el programa de subprocesos, también disminuye la frecuencia.
Ambas máquinas tienen 16 GB de RAM.
Editar
Después de jugar con el código, sospecho que se está estrangulando cuando una tarea crea demasiados hilos. En este programa, tomo cada registro que leo y creo un hilo para él. Solo dejo que pasen alrededor de 20 hilos a la vez, por lo que en ningún momento hay más de 21 hilos, pero hay 14,400,000 registros que se procesarán durante los 30 minutos más o menos, cada uno de esos registros será procesado por un hilo separado.
Creé un programa trivial pthread que absorbió el tiempo de CPU y configuró 10 de ellos en ejecución. El problema de la computadora portátil funcionó y se calentó a 95 ° C sin problemas.
Supongo que volveré a escribir mi código para reutilizar el mismo hilo en lugar de destruirlos e iniciarlos nuevamente.
Actualización 13/05/17
Después de varias horas de trabajo, ahora solo crea n hilos y simplemente los reutiliza, eso no ayudó. Aparte de la temperatura de la CPU, ¿qué hará que esta máquina se acelere?
fuente
Respuestas:
Esto puede ser una posibilidad remota, pero ¿quizás la diferencia en el rendimiento de un solo núcleo y / o el rendimiento de la memoria caché entre los paquetes de CPU 2012 y 2016 es lo suficientemente grande como para que los núcleos carezcan de datos y se reduzcan hasta que puedan volver a funcionar?
Estoy haciendo esa suposición porque indica que suficientes procesos de un solo hilo pueden ejecutar a toda velocidad en todos los núcleos, y un programa simple de múltiples hilos puede ejecutar a toda velocidad en todos los núcleos.
Eso me hace pensar que hay algo en el diseño del programa de su carga de trabajo real frente a la carga de trabajo de múltiples hilos de prueba que no permite que las CPU funcionen todo el tiempo
fuente
La extensión del núcleo /System/Library/Extensions/AppleACPIPlatform.kext controla muchas protecciones de temperatura y CPU. Ya está compilado, obviamente, en su sistema, pero puede estar disponible en https://opensource.apple.com (No puedo encontrarlo, pero solo le di un vistazo rápido). No me sorprendería si Apple tuviera configuraciones muy conservadoras en la capacidad de la CPU.
fuente
Siempre que el sistema operativo reconozca los subprocesos como impredecibles y fuera de control, se acelerará para mantener la estabilidad del hardware y el sistema, el modelo 2012 se comporta de manera diferente y podría bloquearse en el peor de los casos. Me pasó con un control de subprocesos mal implementado, mi culpa. Simplemente no ejecute tantos hilos en un núcleo dual.
fuente
Me pasó con un control de subprocesos mal implementado, mi culpa. Simplemente no ejecute demasiados hilos en una CPU de doble núcleo.
fuente