2011-04-26 35 views
15

Hola soy un tipo de novato de MPI así que por favor tengan paciencia conmigo en este caso. :)MPI: ¿núcleos o procesadores?

Decir que tengo un programa llamado MPI foo.c y ejecutar el ejecutable con

mpirun -np 3 ./foo

Ahora bien, esto significa que el programa se llevará a cabo en paralelo con 3 procesadores (1 proceso por procesador). Pero dado que la mayoría de los procesadores de hoy en día tienen más de un núcleo, (tomar 2 núcleos por procesador, por ejemplo) ¿significa esto que el programa se ejecutará en 3 núcleos o 3 procesadores?

Probablemente esto tiene que ver con mi poca comprensión de cuál es realmente la diferencia entre un núcleo y un procesador, por lo que también podría explicar un poco más que sería útil.

Gracias.

+0

Si cat/proc/cpuinfo en una máquina Linux, verá que cada hyperthread se cuenta como un procesador, casualmente compatible con MPI uso de "procesador". – Hackless

Respuesta

25

mpirun ejecutará una serie de "procesos" en la máquina. La CPU o núcleo donde se ejecutan estos procesos depende del sistema operativo. En una N máquinas cpu con M núcleos en cada CPU, tiene espacio para procesos N * M que se ejecutan a toda velocidad.

Pero, por lo general:

  • Si tiene varios núcleos, cada proceso se ejecutará en un núcleo separado
  • Si solicita más procesos que el núcleo * CPU disponibles, todo va a funcionar, pero con una eficiencia más baja (sí, puede ejecutar trabajos multiproceso en una máquina de un solo núcleo de una sola CPU ...)
  • Si está utilizando un sistema de colas o un sistema MPI preconfigurado para el que existe una lista de máquinas remotas, la asignación se distribuirá en las máquinas remotas.

(Dependiendo de la aplicación MPI, puede haber algunas opciones para forzar una CPU o núcleo específico, pero que no deberían tener que preocuparse por eso).

4

El Programador de sistema operativo intentará asignar de forma óptima núcleos separados a los procesos de su aplicación paralela en un sistema multinúcleo O para separar procesadores en un sistema multiprocesador.

El caso interesante es un sistema multi-core multi-CPU. De nuevo, puede dejar que el Programador del sistema operativo lo haga por usted, O puede aplicar la afinidad central (lógica/física) a sus procesos para vincularlos a un núcleo particular.

4

La distribución de procesos en núcleos y procesadores se maneja mediante el sistema operativo y la implementación de MPI. Al ejecutarse en un escritorio, el sistema operativo generalmente colocará cada proceso en un núcleo diferente, posiblemente redistribuyendo 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, uno o múltiples procesos serán asignados a cada núcleo.

En cuanto al hardware, un núcleo puede ejecutar solo un proceso a la vez. Tecnologías como hyper-threading permiten que múltiples procesos compartan los recursos de un solo núcleo. Hay casos en que dos o más procesos por núcleo son óptimos. Por ejemplo, si un proceso está haciendo una gran cantidad de E/S de archivos, otro puede tomar su lugar y hacer un cálculo mientras que el primero se cuelga en una lectura o escritura.

En resumen, proporcione a MPI el número de procesos que desea ejecutar. La distribución de estos procesos se maneja de forma transparente para el usuario.El número de procesos que se utilizan debe ser determinado por los requisitos de la aplicación (potencias de 2, el número de archivos que se lee), el número de núcleos disponibles, y el número óptimo de los procesos por núcleo para la aplicación.

0

El comando mpirun utiliza un ListaCaliente. Si no lo especifica, probablemente usará "localhost" y ejecutará todos sus procesos allí. Si ejecuta procesos 3 y usted tiene una máquina de 4 núcleos, es probable que obtener una buena aceleración debido a que el sistema operativo en general, los pondrá en diferentes núcleos. Si solo tiene dos núcleos, entonces un núcleo obtendrá dos procesos.

La anterior no es del todo cierto, ya que se permite el sistema operativo para mover los procesos, por lo que es posible que desee utilizar numactl para unirse a un núcleo.

Si usted está en un clúster de varios nodos, a continuación, un MPI bien configuración generará una HostFile donde cada nodo aparece tantas veces como lo ha hecho 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 el algoritmo que permiten, por supuesto.) Solicitud de 9 procesos en ese grupo puede poner en un nodo 8 y el 9 en otro, lo cual es, por supuesto, no es muy bueno para el rendimiento. Es de esperar que su software de clúster incluya un mpirun que distribuya los procesos mejor que eso.

1

desde la vista de rendimiento del trabajo MPI, hay alguna regla explícita: 1) si el código es puro MPI (BLAS no está ajustado con openMP), apague hyperthread y establezca el número de tareas por nodo al núcleos de nodo 2) si es el código de MPI + OpenMP, se puede establecer PPN (procesos por nodo) a los núcleos de nodo y OMP_NUM_THEADS a la 2 (si hay dos hilos de hardware por núcleo) 3) si es el código de MPI + openMP y su clúster es enorme, entonces puede establecer PPN (procesos por nodo) en 1 y OMP_NUM_THEADS en los números lógicos de la CPU para guardar la sobrecarga de comunicación