¿Cuántos núcleos debo utilizar para los cálculos? #cores o #cores -1?

12

Tengo un gran cálculo que hacer. Si bien puedo utilizar todos los núcleos, pensé que ¿hay alguna razón para dejar 1 núcleo y no utilizarlo? (CPU de cálculo solo sin IO). ¿O estoy subestimando el sistema operativo que no sabría manejar y hacer un cambio de contexto adecuado incluso si utilizo todos los núcleos?

Jas
fuente
8
La utilización de todos los núcleos es un buen comienzo, y algunas supersticiones acerca de que el sistema operativo se comporta mejor con "-1 núcleos" probablemente sea solo una superstición, pero en realidad debe perfilarlo, cómo se comporta para su cálculo, su hardware y su sistema operativo.
Doc Brown
En muchos casos, usar # núcleos + 1 tiene mucho sentido. Si solo usa #cores, cualquier bloqueo inesperado (como un error de página) obliga innecesariamente a un núcleo a estar inactivo.
David Schwartz

Respuestas:

28

Los principales sistemas operativos son lo suficientemente maduros para saber cómo manejar los procesos que utilizan todos los núcleos disponibles. Otros procesos pueden (y con frecuencia se verán afectados), pero el cálculo no será más lento porque usó todos los núcleos disponibles.

La elección del número de núcleos depende más de su intención de hacer otra cosa mientras se realiza el cálculo.

Si, en una máquina de escritorio, desea poder usar su navegador web o mirar un video mientras se realiza el cálculo, será mejor que tenga un núcleo libre para ello. Del mismo modo, si el servidor está haciendo dos cosas (como hacer cálculos y, al mismo tiempo, procesar e informar sus métricas), podría ser una buena idea mantener un núcleo libre para la tarea paralela.

Por otro lado, si su prioridad es hacer el cálculo lo más rápido posible, debe usar todos los núcleos.

Arseni Mourzenko
fuente
77
Los programadores modernos del sistema operativo son bastante buenos para mantener interactivos los programas interactivos cuando hay un alto uso de CPU, siempre y cuando los programas interactivos no usen mucha CPU (lo que, por supuesto, puede ser un problema con las aplicaciones web modernas hinchadas)
James_pic
Nota: incluso en servidores, si desea poder ssh y obtener una respuesta rápida, dejar el núcleo 0 solo puede ser útil.
Matthieu M.
11

Depende.

Si la máquina está dedicada a este cálculo, debe usar todos los núcleos; los recursos informáticos no utilizados no aceleran las cosas .

Si está utilizando un programador en tiempo real, un programador no preventivo o una afinidad de procesador, entonces debe ser un poco más cuidadoso porque es fácil privar accidentalmente a otros procesos de todos los recursos informáticos. Sin embargo, tendría que cambiar manualmente esta configuración para que algo salga mal, por lo que, por defecto, no hay ningún problema aquí en la mayoría de los sistemas operativos.

Si la máquina no está dedicada al cálculo, dar el 100% al cálculo puede no ser lo ideal. Por ejemplo, si está utilizando un navegador web mientras se ejecuta el cálculo. Debido a que la carga de su máquina ocasionalmente alcanzará un pico superior al 100%, se sentirá lenta. Las tareas orientadas al rendimiento como el cálculo no se ralentizarán realmente, pero las tareas sensibles a la latencia como las GUI no reaccionarán tan rápido. Entonces es sensato iniciar solo hilos / procesos NPROC-1 para el cálculo. Alternativamente, el uso explícito de una prioridad más baja para el cálculo que para las tareas normales podría resolver este problema, en cuyo caso el cálculo debería usar procesos NPROC para no desperdiciar ningún recurso.

amon
fuente
3
"si está utilizando un navegador web mientras se ejecuta el cálculo [...] se sentirá lento. Las tareas orientadas al rendimiento como el cálculo no se ralentizarán realmente, pero las tareas sensibles a la latencia como las GUI no reaccionarán tan rápidamente". ...] explícitamente usar una prioridad más baja para el cálculo que para las tareas normales podría resolver este problema "- Y es por eso que el valor de prioridad del proceso en Unix se llama" amabilidad "y se configura usando una utilidad llamada nice.
Jörg W Mittag
2
"los recursos informáticos no utilizados no aceleran las cosas" técnicamente, podrían hacerlo. Usar menos núcleos puede permitir una mayor frecuencia de reloj y reducir la sincronización, lo que puede o no acelerar las cosas.
Davidmh
2
Además de las notas de @Davidmh, generalmente en el lado de la CPU, L1 $ y L2 $ se comparten hasta cierto punto entre los subprocesos y L3 $ se comparte en todos los sockets, por lo que el uso de más subprocesos puede causar un aumento de $ fallas que ralentizan los procesos. Especialmente si el proceso está vinculado a la memoria en lugar de al procesador.
Maciej Piechotka
SI establece los niveles de prioridad de proceso / subproceso adecuadamente, puede mitigar el impacto del trabajo en segundo plano en los procesos interactivos. He ejecutado aplicaciones informáticas distribuidas en mi máquina personal durante más de una década; y con las tareas de cómputo de la CPU ejecutándose con baja prioridad, mi capacidad para usar navegadores y otras aplicaciones de escritorio normales no se ve afectada. El uso compartido de recursos en la GPU no es tan avanzado, y he tenido problemas ocasionales con el video HTML5 acelerado por GPU (no importa los juegos) mientras ejecutaba el procesamiento de GPU en segundo plano. Los juegos multiproceso pueden ser problemáticos incluso con GFX ligero; ganar hambrientos hilos 2+
Dan está jugando con Firelight el
1

Soy un poco circunspecto acerca de estar de acuerdo con @motoDrizzt, a continuación, debido a sus votos negativos :), pero esa ha sido mi experiencia real: más es mejor, incluso más allá del número real de núcleos (pero no miles). Por ejemplo, eche un vistazo a http://www.forkosh.com/images/avoronoi.gif donde cada plano 2D de ese voronoi_diagrama 3D se puede generar de forma independiente. Y el programa toma un atributo nfork = n query_string para bifurcar los cálculos para n planos "simultáneamente".

Con un procesador de cuatro núcleos, el tiempo (del usuario) para completar el diagrama disminuye de forma bastante lineal con nfork, hasta aproximadamente nfork = 8 (cuatro núcleos hiperthreaded). Pero más allá de 8, el tiempo aún disminuye, aunque más lentamente. Y más allá de aproximadamente 16, más o menos, no hay ninguna mejora notable. No he analizado este comportamiento en absoluto, pero ingenuamente lo atribuyo a los procesos de malabarismo del sistema operativo (linux slackware 14.2x64 en este caso) para reducir aún más el tiempo de inactividad general.

John Forkosh
fuente
0

La mejor opción depende del sistema. Entonces, lo que desea hacer es ejecutar ambas versiones en un sistema real y luego verificar cómo responde el sistema. ¿Todavía puede usar el navegador, el editor de texto, otras cosas en su sistema? ¿Y el rendimiento es mejor cuando se usan n hilos y no n-1? ¿Qué sucede si ejecuta la aplicación junto con otra aplicación que intenta usar todas las CPU?

Y luego debes considerar hyperthreading. Con cuatro núcleos más hyperthreading, puede usar 8 núcleos o 7 núcleos. Nuevamente, pruebe la capacidad de respuesta del sistema y el tiempo para terminar.

Y finalmente, considere dividir su trabajo en más bloques que hilos. La razón es que diferentes subprocesos terminarán el trabajo en diferentes momentos, y luego querrá que quede algo de trabajo para los subprocesos más rápidos. De lo contrario, tendrá que esperar hasta que finalice el último hilo.

PD. "Hyperthreading no puede ayudar con el código intensivo de FPU porque solo hay una FPU". Absolutamente equivocado Es increíblemente difícil, incluso con código intensivo de FPU, hacer un uso completo de la FPU debido a las latencias. Hyperthreading ayuda porque hay dos veces más operaciones independientes disponibles para la programación.

gnasher729
fuente
-4

No sé cómo escribir esto de una manera que no suene "mal", así que tómalo como un comentario amistoso, ¿de acuerdo?

Dado que una PC promedio ya tiene usualmente miles o más hilos, ¿qué te hace pensar que usar 8 vs 7 hará alguna diferencia? :-)

Use tantos hilos como sea posible. Y si no tiene que preocuparse por la respuesta del sistema operativo, y sus hilos se ejecutan durante bastante tiempo (más de un segundo), incluso puede experimentar usando el doble de núcleos.

motoDrizzt
fuente
3
Pero la mayoría de estos miles de hilos no usan 100% de CPU, ¿verdad?
Andreas Rejbrand
1
Usar el doble del número de núcleos generalmente no mejora los tiempos de cálculo. De hecho, usar más que el número de núcleos físicos generalmente no es beneficioso, incluso si tiene más núcleos lógicos (a través de HyperThreading, etc.; aunque esto puede depender de la tarea exacta que está realizando). Fuente: experiencia del pasado, utilizando el procesamiento paralelo de MATLAB.
Sanchises
1
@Sanchises Esto se debe a que hyperthreading aprovecha el intercalado de instrucciones cuasi-paralelo: es efectivo para códigos ramificados y pesados ​​en memoria. Los cálculos de matriz son muy intensos en FPU y solo hay una FPU por núcleo físico, por lo que hyperthreading no puede ayudarlo.
J ...