Como @Baile menciona en los comentarios, esto es altamente de aplicación, sistema, entorno específico.
Y como tal, no voy a tomar el enfoque de línea dura de mencionar exactamente 1 hilo para cada núcleo. (o 2 subprocesos/núcleo en el caso de Hyperthreading)
Como experimentado programador de memoria compartida, he visto por experiencia que el número óptimo de subprocesos (para una máquina de 4 núcleos) puede oscilar entre 1 y 64 +.
Ahora voy a enumerar las situaciones que pueden causar este rango:
Optimal Hilos < # de núcleos
En ciertas tareas que son de grano fino muy paralelo (como pequeñas FFT), la sobrecarga de enhebrado es el factor de rendimiento dominante. En algunos casos, no es útil paralizar en absoluto. En algunos casos, obtienes aceleración con 2 subprocesos, pero escalando hacia atrás en 4 subprocesos.
Otro problema es la contención de recursos. Incluso si tiene una tarea altamente paralelizable que puede dividirse fácilmente en 4 núcleos/hilos, puede verse embotellado por el ancho de banda de memoria y los efectos de caché. Muy a menudo, encuentra que 2 hilos serán tan rápidos como 4 hilos.(Como si a menudo el caso con muy grandes FFT)
óptimas Hilos = # de Núcleos de
Este es el caso óptimo. No hay necesidad de explicar aquí, un hilo por núcleo. La mayoría de las aplicaciones vergonzosamente paralelas que no son de memoria o E/S encajan aquí.
Optimal Temas> # de núcleos
Aquí es donde se pone interesante ... muy interesante. ¿Has oído hablar de desequilibrio de carga? ¿Qué tal la descomposición excesiva y el robo de trabajo?
Muchas aplicaciones paralelizables son irregulares, lo que significa que las tareas no se dividen en subtareas de igual tamaño. Entonces, si puede terminar dividiendo una tarea grande en 4 tamaños desiguales, asígnelos a 4 hilos y ejecútelos en 4 núcleos ... ¿el resultado? Pobre rendimiento paralelo porque 1 hilo pasó a tener 10 veces más trabajo que los otros hilos.
Una solución común aquí es sobre descomponer tarea en muchas subtareas. Puede crear subprocesos para cada uno de ellos (de modo que ahora obtiene hilos >>núcleos). O puede usar algún tipo de planificador de tareas con un número fijo de hilos. No todas las tareas son adecuadas para ambos, por lo que con bastante frecuencia, el enfoque de sobredescomposición de una tarea a 8 o 16 hilos para una máquina de 4 núcleos ofrece resultados óptimos.
Aunque el engendrar más hilos puede conducir a un mejor balance de carga, la sobrecarga se acumula. Por lo general, hay un punto óptimo en alguna parte. He visto hasta 64 hilos en 4 núcleos. Pero como se mencionó, es altamente específico de la aplicación. Y necesitas experimentar
EDIT: La expansión de respuesta a más directamente responder a la pregunta ...
¿Cuál es el costo de cambio de contexto? El tiempo para almacenar y restaurar registros de CPU para contexto diferente?
Esto es muy dependiente del medio ambiente, y es algo difícil de medir directamente.
Respuesta corta: Muy CaroThis might be a good read.
¿Qué hay de cachés, tuberías y varias cosas en código de predicción dentro CPU? ¿Podemos decir que cada vez que cambiamos de contexto, dañamos las cachés, las tuberías y algunas instalaciones de decodificación de código en la CPU?
Respuesta corta: Sí cuando se cambio de contexto a cabo, es probable que limpiar su tubería y estropear todos los predictores. Lo mismo con cachés Es probable que el nuevo hilo reemplace el caché con nuevos datos.
Aunque hay una trampa. En algunas aplicaciones donde los subprocesos comparten los mismos datos, es posible que un subproceso pueda potencialmente "calentar" el caché para otro subproceso entrante u otro subproceso en un núcleo diferente que comparte el mismo caché.(Aunque es raro, he visto que esto suceda antes en una de mis máquinas NUMA - superlinear speedup:!?!?! 17.6x a través de 16 núcleos)
Así que más subprocesos que se ejecutan en un solo núcleo, menos trabajo que puede hacer juntos en comparación con su ejecución en serie?
Depende, depende ... Aparte de la hiperversión, sin duda habrá una sobrecarga. Pero he leído un artículo en el que alguien utiliza un segundo hilo para precargar el hilo principal ... Sí que es una locura ...
La respuesta es muy aplicación-, system y específico del equipo. Pero probablemente sea más grande que 4, pero mucho menos de 50 hilos. ¿Intentó medir con 4, 6, 8, 10 hilos? –
4 hilos (o 8 w/subprocesamiento Hyper). Menos porciones de datos. mejores propiedades de caché. – bestsss