Pregunta

Estoy trabajando en un clúster de acoplamiento débil para el procesamiento de algunos datos. El código de red y el código de procesamiento están en su lugar, pero estamos evaluando diferentes metodologías en nuestro enfoque. En este momento, como deberíamos estar, estamos limitados por los problemas de rendimiento de E / S y estamos tratando de reducir ese cuello de botella. Obviamente, los interruptores más rápidos como Infiniband serían increíbles, pero no podemos darnos el lujo de simplemente deshacernos de lo que tenemos y conseguir nuevos equipos.

Mi pregunta planteada es la siguiente. Todas las aplicaciones HPC tradicionales y serias realizadas en clústeres se implementan normalmente con el paso de mensajes en lugar de enviar directamente a través de sockets. ¿Cuáles son los beneficios de rendimiento para esto? ¿Deberíamos ver una aceleración si cambiamos de sockets?

¿Fue útil?

Solución

MPI PUEDE usar sockets. Pero también hay implementación de MPI para ser usada con SAN (red de área del sistema) que usa memoria compartida distribuida directa. Eso por supuesto si tienes el hardware para eso. Por lo tanto, MPI le permite utilizar dichos recursos en el futuro. En ese caso, puede obtener mejoras masivas en el rendimiento (en mi experiencia con grupos en el momento de la universidad, puede alcanzar ganancias de unos pocos órdenes de magnitud). Por lo tanto, si está escribiendo un código que puede ser portado a clústeres de mayor nivel, usar MPI es una muy buena idea.

Incluso descartando problemas de rendimiento, el uso de MPI puede ahorrarle mucho tiempo, que puede usar para mejorar el rendimiento de otras partes de su sistema o simplemente guardar su cordura.

Otros consejos

Recomendaría usar MPI en lugar de rodar el tuyo, a menos que seas muy bueno en ese tipo de cosas. Habiendo escrito algunas aplicaciones distribuidas de computación usando mis propios protocolos, siempre me encuentro reproduciendo (y reproduciendo pobremente) las características que se encuentran dentro de MPI.

En cuanto al rendimiento, no esperaría que MPI le proporcionara ninguna aceleración tangible de la red; utiliza sockets como usted. Sin embargo, MPI le proporcionará gran parte de la funcionalidad que necesitaría para administrar muchos nodos, es decir, la sincronización entre nodos.

El rendimiento no es la única consideración en este caso, incluso en los clústeres de alto rendimiento. MPI ofrece una API estándar, y es " portátil. & Quot; Es relativamente trivial cambiar una aplicación entre las diferentes versiones de MPI.

La mayoría de las implementaciones de MPI usan sockets para comunicaciones basadas en TCP. Las probabilidades son buenas de que cualquier implementación de MPI dada se optimice mejor y proporcione un paso de mensajes más rápido que una aplicación local que utiliza sockets directamente.

Además, si alguna vez tiene la oportunidad de ejecutar su código en un grupo que tiene InfiniBand, la capa MPI abstraerá cualquiera de esos cambios de código. Esto no es una ventaja trivial: codificar una aplicación para usar directamente la implementación de OFED (u otro verbos IB) es muy difícil.

La mayoría de las aplicaciones MPI incluyen pequeñas aplicaciones de prueba que pueden usarse para verificar la corrección de la configuración de la red independientemente de su aplicación. Esta es una gran ventaja cuando llega el momento de depurar su aplicación. El estándar MPI incluye el " pMPI " Interfaces, para perfilar llamadas MPI. Esta interfaz también le permite agregar fácilmente sumas de comprobación u otra verificación de datos a todas las rutinas de paso de mensajes.

MPI tiene el beneficio de que puedes hacer comunicaciones colectivas. Hacer emisiones / reducciones en O (log p) / * p es su número de procesadores * / en lugar de O (p) es una gran ventaja.

Tendré que estar de acuerdo con OldMan y con el espacio libre. A menos que sepa de una métrica específica y mejora de alguna métrica útil (rendimiento, mantenimiento, etc.) sobre MPI, reinvente la rueda. MPI representa una gran cantidad de conocimiento compartido sobre el problema que intenta resolver.

Hay una gran cantidad de problemas que debe abordar que van más allá del simple envío de datos. La configuración y el mantenimiento de la conexión se convertirán en su responsabilidad. Si MPI es la abstracción exacta (parece que lo es) que necesitas, úsala.

Como mínimo, usar MPI y luego refactorizarlo con su propio sistema es un buen método que cuesta la instalación y la dependencia de MPI.

Me gusta especialmente el punto de OldMan de que MPI le ofrece mucho más que una simple comunicación de socket. Obtiene una gran cantidad de implementaciones de computación distribuida y paralela con una abstracción transparente.

El paso de mensajes es un paradigma, no una tecnología. En la instalación más general, MPI usará sockets para comunicarse. Podría ver una aceleración cambiando a MPI, pero solo en la medida en que no haya optimizado su comunicación de socket.

¿Cómo se vincula su E / S de aplicación? ¿Está vinculado al transferir los bloques de datos a los nodos de trabajo, o está vinculado debido a la comunicación durante el cálculo?

Si la respuesta es " debido a la comunicación " entonces el problema es que está escribiendo una aplicación estrechamente acoplada y tratando de ejecutarla en un clúster diseñado para tareas acopladas libremente. La única forma de obtener rendimiento será obtener un mejor hardware (switches más rápidos, infiniband, etc.) ... ¿quizás podrías pedir prestado tiempo en el HPC de otra persona?

Si la respuesta es " bloque de datos " luego, las transferencias consideran asignar a los trabajadores múltiples bloques de datos (para que se mantengan ocupados más tiempo) & amp; Comprimir los bloques de datos antes de la transferencia. Esta es una estrategia que puede ayudar en una aplicación acoplada libremente.

No he usado MPI, pero he usado sockets bastante. Hay algunas cosas a considerar en los sockets de alto rendimiento. ¿Estás haciendo muchos paquetes pequeños, o paquetes grandes? Si está haciendo muchos paquetes pequeños, considere desactivar el algoritmo de Nagle para una respuesta más rápida:

setsockopt (m_socket, IPPROTO_TCP, TCP_NODELAY, ...);

Además, el uso de señales puede ser mucho más lento cuando se intenta obtener un gran volumen de datos. Hace mucho tiempo hice un programa de prueba en el que el lector esperaría una señal y leería un paquete: obtendría un paquete de 100 paquetes por segundo. Luego acabo de bloquear las lecturas y obtuve 10000 lecturas / seg.

El punto es mirar todas estas opciones y probarlas. Diferentes condiciones harán que diferentes técnicas sean más rápidas / lentas. Es importante no solo obtener opiniones, sino ponerlas a prueba. Steve Maguire habla de esto en "Escritura de código sólido". Utiliza muchos ejemplos que son contraintuitivos y los prueba para descubrir qué hace al código mejor / más rápido.

MPI usa sockets debajo, así que realmente la única diferencia debería ser la API con la que su código interactúa. Puede ajustar el protocolo si está utilizando sockets directamente, pero eso es todo. ¿Qué estás haciendo exactamente con los datos?

MPI usa sockets, y si sabe lo que está haciendo, probablemente pueda obtener más ancho de banda de los sockets porque no necesita enviar tantos metadatos.

Pero debes saber lo que estás haciendo y es probable que sea más propenso a errores. esencialmente, estarías reemplazando mpi con tu propio protocolo de mensajería.

Para mensajes de business de alto volumen y bajos gastos generales, es posible que desee revisar OAMQ con varios productos. La variante de código abierto OpenAMQ ejecuta el comercio en JP Morgan, por lo que debería ser confiable, ¿no es así?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top