¿Cómo se distribuyen los núcleos de la CPU a cada kernel en el cálculo de la paralelización?
Solo quiero asegurarme de que entiendo correctamente antes de hacer preguntas. Vi a algunas personas decir que algunas funciones en Mathematica usarán automáticamente múltiples núcleos (no me refiero a aquellos que paralelizamos, sino a aquellos como NIntegrate
), así que creo que si tengo 2 núcleos, será más rápido que uno solo. núcleo. Entonces mi pregunta es si tengo un código como el siguiente:ParallelTable[NIntegrate[x, {x, 1, 3}], {loop, 1, 3}]
Creo que se lanzarán tres núcleos. Si tengo 4 núcleos, ¿cómo se distribuyen estos cuatro núcleos a cada núcleo? (Como creo que cada kernel puede usar múltiples núcleos en función de la propiedad de integración de funciones)
Respuestas
¡Bienvenido noo-b, m.se es una gran comunidad para el aprendizaje infinito sobre M!
Creo que tienes algunas suposiciones falsas:
En primer lugar, incluso las operaciones de un solo subproceso pueden pasar por varios núcleos. Un buen sistema operativo intenta evitar eso, pero cada cierto tiempo, puede cambiar a otro núcleo, o puede dividir la carga en varios núcleos, aunque este último generalmente no por un tiempo prolongado.
En segundo lugar, no puede asumir que NIntegrate siempre se paralelizará para todas las entradas y, en particular, no puede suponer que NIntegrate se paralelizará durante todo el tiempo de cálculo. Puede paralelizar solo para la inicialización o al final, o en tareas seleccionadas en el medio. Por ejemplo,
Do[Do[NIntegrate[x,{x,1,3}],{3}],{100000}]
si observa la utilización principal (no: la utilización del proceso, como en un administrador de tareas simple), si está en Linux, puede ejecutar la parte superior y presionar 1, verá que esto pasa el 99% del tiempo en un núcleo. Puede cambiar el núcleo después de un tiempo, pero luego verá el 99% para ese núcleo. Por lo tanto, no veo ningún subproceso de NIntegrate en varios núcleos, al menos no todo el tiempo (tal vez durante fracciones de segundos). Esto puede ser diferente para diferentes entradas de NIntegrate, pero este simple ejemplo muestra que NIntegrate no siempre se paraleliza y no durante toda la duración de su cálculo.
Con el marco de paralelismo M esto no cambia, es realmente una cuestión del sistema operativo. Con ParallelTable (y hermanos) solo está proporcionando tareas de procesamiento de más procesos, y la forma en que el o / s programa eso a los núcleos depende completamente del o / s. Por lo tanto, no se puede "retirar" la asignación a los núcleos a partir de una comprensión de los procesos paralelos.
algo así como una tangente:
En Scala, Java o C # (o muchos otros lenguajes) puede programar tareas a nivel de hilo. Pero incluso entonces depende de los o / s programar las huellas en los núcleos. Con vmstat de Java tienes una visualización maravillosa de los hilos (barras horizontales que crecen con el tiempo, una por hilo), creo que lo que realmente te interesa es cómo funcionan las cosas en los hilos, no necesariamente cómo se asignan los hilos a los núcleos. . Dicho esto, sin embargo, los hilos son un concepto de software, no un concepto de hardware, un núcleo no sabe qué es un hilo. Pero creo que un análisis de subprocesos le dirá más para entender la concurrencia como la asignación a los núcleos, y la conmutación de núcleos y los porcentajes de carga de trabajo para cada núcleo depende completamente del o / s.
Hay algunas funciones que utilizan automáticamente varios núcleos. La cantidad de núcleos que usan está determinada por algunas de las configuraciones en SystemOptions["ParallelOptions"]
.
Si usa estas funciones en subkernels, usarán solo un núcleo. Puede verificar esto mirando ParallelEvaluate@SystemOptions["ParallelOptions"]
. Observe que todos los recuentos de subprocesos se establecen en 1 en los subnúcleos.
Generalmente, la paralelización explícita (como ParallelTable
) no es tan eficiente como la paralelización incorporada de algunas funciones. Por lo tanto, si su cuello de botella es una función que ya se ejecuta en paralelo, entonces la implementación de la paralelización adicional con ParallelTable
funciones relacionadas lo hará más lento (o al menos lo hizo en todos los casos que verifiqué).