La mayoría, si no todas, las computadoras modernas usan subprocesos múltiples. ¿Cómo obtengo el mejor rendimiento de una CPU para un proceso específico al restringirlo a ese proceso?

En la computación a gran escala, la computación generalmente abarca los espacios de memoria múltiples y distribuidos de varias instancias independientes de O / S, por lo que no hay un único planificador que asigne hilos a los núcleos, y depende del programa de aplicación realizar la asignación.

La programación estándar del proceso está diseñada en parte para garantizar que su proceso no pueda monopolizar la CPU, a fin de permanecer receptivo bajo una carga pesada. Sin embargo, para lograr el máximo rendimiento, monopolizar la CPU es precisamente lo que desea que haga su proceso, siempre que sea lo suficientemente intensivo en cómputo como pueda.

  • A nivel de proceso, el conjunto de tareas (1) le permite restringir qué núcleos se pueden programar para que se ejecuten sus subprocesos cuando se inicia uno.
  • Si su aplicación está enhebrada explícitamente utilizando pthreads, las interfaces como las macros cpu_set (3) le permiten controlar las asignaciones de hilos / núcleos dentro del código, pero pueden ser un poco difíciles de programar.
  • Si está utilizando hilos implícitos creados por OpenMP, deberá revisar la documentación de la biblioteca de tiempo de ejecución que está utilizando; dos comunes son la configuración de GOMP_CPU_AFFINITY para los compiladores GNU y el Intel OpenMP * Thread Affinity Control para icc / icpc / ifort.

Sin embargo, todo esto solo cuenta si la velocidad de su programa está realmente limitada por el costo de los cálculos; si su programa espera una cantidad sustancial de tiempo para discos, redes o similares, estará mejor con las instalaciones de tiempo compartido de un planificador automático Como dice Toby Thain, son muy buenos.

No intente asignar toda la CPU a un proceso a menos que esté seguro de que lo necesita, solo causará muchas esperas inútiles si no es necesario.

Este es el trabajo del planificador de procesos, y generalmente hace un buen trabajo automáticamente.

Se utilizan varias heurísticas para asignar subprocesos a las CPU. Se vuelve más difícil cuando una máquina combina tareas vinculadas a cómputo e interactivas. La historia del planificador de Linux, por ejemplo, ha sido larga y complicada; actualmente usa el Programador completamente justo por defecto (creo): Página en kernel.org