siemens - MPI: ¿núcleos o procesadores?
mpi siemens (6)
Hola, soy una especie de MPI noob, así que por favor tengan paciencia conmigo en este caso. :)
Digamos que tengo un programa MPI llamado foo.c y ejecuto el ejecutable con
mpirun -np 3 ./foo
Ahora, esto significa que el programa se ejecutará en paralelo utilizando 3 procesadores (1 proceso por procesador). Pero dado que la mayoría de los procesadores de hoy tienen más de un núcleo, (esto significa 2 núcleos por procesador) ¿significa esto que el programa se ejecutará en 3 núcleos o 3 procesadores?
Probablemente esto tenga que ver con mi escasa comprensión de cuál es realmente la diferencia entre un núcleo y un procesador, por lo que si también pudiera explicar un poco más, eso sería útil.
Gracias.
Desde la vista de rendimiento del trabajo MPI, hay una regla explícita: 1) si el código es código MPI puro (BLAS no está optimizado con OpenMP), desactive HyperHread y establezca el número de tareas del trabajo por nodo en los núcleos del nodo 2) si el código es MPI + openMP, puede establecer PPN (procesos por nodo) en los núcleos del nodo y OMP_NUM_THEADS en los 2 (si hay dos subprocesos de hardware por núcleo) 3) si el código es MPI + openMP y se agrupa enorme, entonces puede establecer PPN (procesos por nodo) en 1 y OMP_NUM_THEADS en los números lógicos de la CPU para ahorrar la sobrecarga de comunicación
El Programador de sistemas operativos intentará asignar de manera óptima núcleos separados a los procesos de su aplicación paralela en un sistema de múltiples núcleos O a procesadores separados en un sistema de múltiples procesadores.
El caso interesante es un sistema multi-core multi cpu. Nuevamente, puede dejar que el Programador del sistema operativo lo haga por usted, O puede imponer la afinidad del núcleo (lógica / física) a sus procesos para vincularlos a un núcleo en particular.
El comando mpirun utiliza una lista de hosts. Si no lo especifica, probablemente usará "localhost" y ejecutará todos los procesos allí. Si ejecuta 3 procesos y tiene una máquina de 4 núcleos, probablemente obtenga una buena aceleración porque el sistema operativo generalmente los ubicará en diferentes núcleos. Si solo tiene dos núcleos, entonces un núcleo obtendrá dos procesos.
Lo anterior no es del todo cierto, ya que el sistema operativo puede mover procesos, por lo que es posible que desee usar numactl
para vincularlos a un núcleo.
Si se encuentra en un clúster de múltiples nodos, entonces un mpi bien configurado generará un archivo de host donde cada nodo aparecerá tantas veces como tenga núcleos. Por lo tanto, en un clúster de 4 nodos con 8 núcleos por nodo, puede solicitar hasta 32 procesos y esperar una aceleración casi perfecta. (Si su código y su algoritmo lo permiten, por supuesto). Solicitar 9 procesos en ese grupo puede poner 8 en un nodo y el 9 en otro, lo que por supuesto no es excelente para el rendimiento. Esperaría que su software de clúster venga con un mpirun que distribuya los procesos mejor que eso.
La distribución de los procesos a los núcleos y procesadores es manejada por el sistema operativo y la implementación de MPI. Al ejecutarse en una computadora de escritorio, el sistema operativo generalmente ubicará cada proceso en un núcleo diferente, lo que posiblemente redistribuya los procesos durante el tiempo de ejecución. En sistemas más grandes, como una supercomputadora o un clúster, la distribución es manejada por administradores de recursos como SLURM. Sin embargo, esto sucede, se asignarán uno o varios procesos a cada núcleo.
Con respecto al hardware, un núcleo puede ejecutar un solo proceso a la vez. Las tecnologías como el hyper-threading permiten que múltiples procesos compartan los recursos de un solo núcleo. Hay casos donde dos o más procesos por núcleo son óptimos. Por ejemplo, si un proceso está realizando una gran cantidad de E / S de archivos, otro puede tomar su lugar y realizar el cálculo, mientras que el primero se cuelga en una lectura o escritura.
En resumen, dé a MPI el número de procesos que desea ejecutar. La distribución de estos procesos se maneja de manera transparente para el usuario. La cantidad de procesos que utilice debe ser determinada por los requisitos de la aplicación (potencias de 2, cantidad de archivos para leer), la cantidad de núcleos disponibles y la cantidad óptima de procesos por núcleo para la aplicación.
Para proporcionar un marco útil, consideraría esta jerarquía:
- una placa base puede contener una o más fichas / dados;
- un chip / dado puede contener uno o más núcleos (CPU independientes);
- una CPU puede trabajar uno o más subprocesos simultáneamente (el multiproceso que conozco consta de dos subprocesos)
- un chip / dado puede contener uno o más núcleos (CPU independientes);
En los primeros días, la mayoría de las veces tenía una placa base con un chip y una CPU ejecutando un subproceso. Solo se pudo tratar un proceso a la vez, y el conjunto de hardware de asistencia se denominó procesador . Hubo una asignación uno a uno entre piezas de software (la tarea a ejecutar) y piezas de hardware (el dispositivo para ejecutar la tarea).
El proceso es definitivamente una noción de software . "Hilo" es, en términos simples, una especificación de "proceso" en el contexto de la computación concurrente paralela. Hoy en día, el procesador puede referirse a un dispositivo físico, así como a sus capacidades de procesamiento extendidas (multihilo nuevamente, lo que sin duda es una implementación tecnológica). Por ejemplo, puede tener máquinas con dos chips en la placa base, con cuatro núcleos / CPU por chip, y con cada núcleo / CPU ejecutando dos subprocesos simultáneamente. Entonces podrá ejecutar 2x4x2 = 16 procesos (sin sobre suscripción de recursos, de cursos).
La sintaxis MPI que usted cita se dirige a los procesos (opción np
), o hilos si lo desea. La parte de descripción de man mpirun
incluso se refiere a procesos como ''slots'' (por ejemplo, vea las especificaciones para el archivo de host).
Las ranuras indican cuántos procesos pueden ejecutarse potencialmente en un nodo.
Este uso parece un legado de esa estrecha correspondencia entre las unidades de hardware y las unidades de software que era estándar en ese entonces. "Slot" es originalmente una característica de material / hardware, no muy diferente del término "socket" que ha sufrido un cambio similar de semántica en ocasiones.
Así que de hecho, siento bastante simpatía por su confusión. Si es un usuario de Linux, puede visualizar el informe de cat /proc/cpuinfo
. Estas líneas se refieren a un procesador llamado ''2'' de cada cuatro:
processor : 2
...
physical id : 0
siblings : 4
core id : 2
cpu cores : 4
Dicen que en esta máquina solo obtuve un chip (ya que ''phyical id'' toma solo un valor en la lista completa, omitido), este chip como 4 ''cpu cores'' y este chip está ejecutando cuatro hermanos (4 hilos, por lo que no hay multihilo). En este caso hay 4 elementos de procesamiento y 4 cpu cores.
En el ejemplo anterior con subprocesos múltiples, vería una lista de 16 procesadores , 2 valores para ''id físico'' (chips), ''cpu cores'' igual a 4 (por chip) y ''hermanos'' igual a 8 (por chip) desde multihilo está habilitado en ese chip. En este caso, tiene cuatro veces más procesadores que núcleos.
Por lo tanto, en este contexto extendido, ''procesador'' indica la capacidad de la máquina para trabajar en un ''proceso'', y esto es lo que MPI y usted desean usar, independientemente del número y las características de los núcleos que pueden habilitar esto. Solo necesita obtener una visión general de dónde provienen estas capacidades de procesamiento.
Otro comando útil de Linux es lscpu
:
...
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 1
...
Hay ''socket'' de hecho es la conexión física en la placa base donde se conecta el chip, por lo que es un nombre de chip de hecho. De hecho no hay multihilo aquí.
Estoy en deuda con las discusiones en esta otra publicación https://unix.stackexchange.com/q/146051/132913
mpirun ejecutará una serie de "procesos" en la máquina. La cpu o el núcleo donde se ejecutan estos procesos depende del sistema operativo. En las máquinas N cpu con M núcleos en cada cpu, tiene espacio para que los procesos N * M se ejecuten a toda velocidad.
Pero, típicamente:
- Si tiene varios núcleos, cada proceso se ejecutará en un núcleo separado
- Si solicita más procesos que el core * cpus disponible, todo se ejecutará, pero con una menor eficiencia (sí, puede ejecutar trabajos de procesos múltiples en una máquina de un solo núcleo de cpu única ...)
- Si está utilizando un sistema de colas o un sistema MPI preconfigurado para el cual existe una lista de máquinas remotas, la asignación se distribuirá en las máquinas remotas.
(Dependiendo de la implementación de mpi, puede haber algunas opciones para forzar una CPU o núcleo específicos, pero no debería preocuparse por eso).