2010-05-02 14 views
5

Tengo que admitir que me sorprendió bastante ver cuántas líneas de código se requieren para transferir una C struct con MPI.MPI y C construye

¿En qué circunstancias va a funcionar simplemente transmitir una estructura usando el tipo de datos predefinido MPI_CHAR? Considere el siguiente ejemplo:

struct particle { 
    double x; 
    double y; 
    long i; 
}; 

struct particle p; 
MPI_Isend(&p, sizeof(particle), MPI_CHAR, tag, MPI_COMM_WORLD, &sendr); 

En mi caso, todos los procesos se ejecutan en la misma arquitectura. ¿El relleno es el único problema?

+1

Me gustaría aprovechar esta oportunidad para decir si MPI no es un requisito estricto, utilice los búferes de protocolo de Google. http://code.google.com/apis/protocolbuffers/ – Stephen

+0

no debe preocuparse por el relleno, sizeof informa el valor correcto, incluido el relleno – Anycorn

+1

, sí, pero puede variar según la arquitectura ... – hanno

Respuesta

8

MPI_BYTE es el tipo de datos para usar al enviar datos sin tipo, no MPI_CHAR. Si las dos máquinas tienen la misma arquitectura pero usan una codificación de caracteres diferente, el uso de MPI_CHAR puede dañar sus datos. El envío de sus datos como MPI_BYTE dejará la representación binaria tal como está y no realizará ninguna conversión de representación.

Dicho esto, sí, técnicamente es correcto enviar una estructura de esa manera, si (y solo si) puede garantizar que la representación de los datos será la misma en los extremos de envío y recepción. Sin embargo, es una práctica de programación deficiente, ya que ofusca el propósito de su código e introduce la dependencia de la plataforma.

Tenga en cuenta que solo tiene que definir y confirmar un tipo de datos una vez, mientras que generalmente necesitará escribir el código para enviarlo varias veces. Reducir la claridad de todos tus envíos solo para guardar un par de líneas en la definición única no es una transacción.

+0

Gracias. Solo una pregunta más: ¿hay algún beneficio de rendimiento al usar 'MPI_BYTE'? O bien, ¿hay alguna sobrecarga cuando transmito una estructura con mi propio tipo de datos MPI? Estoy pensando en algo como MPI copiando los datos en otro buffer en trozos pequeños, etc ... – hanno

+0

Esto probablemente depende de la implementación, y me imagino que cualquier ganancia de rendimiento que obtengas al no realizar verificaciones de representación/conversión es masivamente ensombrecido por el costo total de pasar un mensaje en primer lugar. Aún así, podría ser un experimento interesante comparar cuánto tiempo se tarda en enviar una carga útil grande (miles) de estructuras escritas versus sin tipo. – suszterpatt

3

Personalmente, me preocupa más la comprensibilidad y el mantenimiento, incluso la portabilidad, que el relleno. Si estoy enviando una estructura, me gusta mi código para mostrar que estoy enviando una estructura, no una secuencia de bytes o caracteres. Y espero que mis códigos se ejecuten en múltiples arquitecturas, en múltiples generaciones de estándares de lenguaje y compiladores.

Supongo que todo lo que digo es que, si vale la pena definir una estructura (y obviamente piensas que lo es), entonces vale la pena definir una estructura. Guardar unas pocas líneas de (casi) repetitivo no es un gran argumento en contra de eso.

+1

No entiendo el argumento sobre la mantenibilidad. En el segmento de código anterior, puedo cambiar la estructura sin tener que hacer nada más. Mientras que si lo hago de la manera correcta usando 'MPI_Type_create_struct', tengo que cambiar al menos 4 líneas de código ... – hanno

+0

@hanno, vea la respuesta de @ suszterpatt para el argumento sobre la mantenibilidad, mejor explicado de lo que pude. –