Pregunta ¿Esta falta de aceleración está relacionada con el procesador o el código?


He escrito un programa que usa MPI, resuelve un sistema muy grande de ecuaciones. Estoy obteniendo muy buenas "aceleraciones" para sistemas muy grandes. Lo que quiero decir con esto es que si aumente el número de procesos, se sumará al tiempo que lleva completar las mitades más un tiempo constante que considero comunicación. Por ejemplo, en un proceso puede tomar 60s luego en dos puede tomar 35s (60 + 5) luego en 4 podría tomar 20.5 (17.5 + 3) etc.

Sin embargo, cuando ingreso a sistemas que son aproximadamente de 1 millón por 1 millón, comienzo a obtener resultados extraños. Al pasar de 4 núcleos a 8 núcleos, obtengo la mitad del tiempo más 10 segundos de "comunicación". Es decir, el tiempo que toma completar el cálculo va de ~ 260 a ~ 140.

Esto está bien, pero luego, al pasar de 8 a 16, el tiempo pasa de ~ 140 a ~ 110, también obtengo un resultado pobre muy similar cuando voy del 16 al 32. Es decir, ~ 110 a ~ 85.

Parece que creo que podría tener algo que ver con el procesador en sí, ya que este comportamiento no aparecería repentinamente (?).

Hay 2 de estos procesadores en el sistema

https://ark.intel.com/products/120485/Intel-Xeon-Gold-6140-Processor-24_75M-Cache-2_30-GHz

También hay alrededor de 8000GB de RAM.

Me gustaría alguna explicación de por qué esto podría estar sucediendo.

Me complace proporcionar más información. Sé que este es un problema complejo y no estoy seguro de qué información necesita en total.


0


origen


¿Cómo has escrito tu programa? ¿Las instancias de proceso separadas tienen que sincronizarse entre sí o enviar datos entre ellas? ¿También usan algo más además de la CPU? ¿Consumen RAM (más de lo normal), escriben en el disco (tienen E / S) o similar? - Fanatique
Sí, hay numerosas instancias en las que se sincronizan y un nodo (nodo principal) envía datos a todos los otros nodos. Sin embargo, para la mayoría de mis otros experimentos (de menos de 1 milisegundo), el tiempo de comunicación a medida que aumentamos el recuento del procesador parece casi constante. Quizás aumente un poco. Pero nada como saltar de 10 a 30 segundos como en este caso. - HMPARTICLE
¿Cuáles son las cantidades de datos reales que se están aplicando? Usted dice que su "sistema" es "1 millón por 1 millón", pero que en realidad es un poco sin sentido, ¿cuánto datos ¿Tiene que estar sincronizado entre todos estos procesos como cada tamaño que está probando? ¿Que lenguaje de programación estas usando? Incluso Python tiene MPI, pero Python puede tener problemas con conjuntos de datos dinámicos masivos ... aunque lo mismo puede decirse de cualquier idioma. - Mokubai♦
Estoy usando C ++. Doy la dimensión como un producto de dos enteros pares, por lo que n = 256 ym = 512 por ejemplo. Supongamos que tengo 4 procesos. Luego, el nodo 0 distribuye (512/4) * 256 ^ 2 "dobles" a cada uno de los procesos. El cuadrado es porque las matrices se están pasando alrededor. Hace algún cálculo y luego al final del cálculo se llama MPI_allgather. - HMPARTICLE
Si tiene dos procesadores y está utilizando MPI, ¿está teniendo en cuenta el hecho de que cada procesador puede tener su "propio" banco de RAM y los datos deben estar presentes en ambos bancos o los procesos en la segunda CPU pueden tener que leer eso mediante la primera CPU. Está tu sistema usando NUMA o de lo contrario golpear tales limitaciones? - Mokubai♦


Respuestas:


Difícil de diagnosticar de esta manera, pero aquí hay algunos puntos:

  • Cada proceso usa RAM, por lo que duplicar el número de procesos significa doblando la RAM requerida. Si la memoria RAM física disponible se agota, se reducirá el intercambio en el disco tratamiento.

  • Incluso en una computadora multi-core, algunos recursos son comunes a todos los procesos. Estos incluyen principalmente memoria RAM y disco, por lo que el uso intensivo significará que los procesos contendrán sobre el acceso a los recursos y habrá esperas.

  • Si los procesos usan métodos de sincronización como semáforos, se espera un tiempo perdido en espera, que aumentará en proporción directa al número de procesos.

Muchos de estos cuellos de botella se pueden ver simplemente observando el comportamiento de sus procesos a través del Administrador de tareas o el Administrador de recursos, para que pueda identificar el cuello de botella y mejorarlo.


0