2010-02-13 7 views
5

Necesito MPI_Gatherv() un número de pares int/string. Digamos que cada par se ve así:Pasar estructuras de longitud variable entre procesos MPI

struct Pair { 
    int x; 
    unsigned s_len; 
    char s[1]; // variable-length string of s_len chars 
}; 

¿Cómo se define un tipo de datos MPI apropiado para Pair?

+0

Utilice 'char s [0];' para la matriz de longitud variable, no 'char s [1];'. – kennytm

+0

@KennyTM, s [0] da "advertencia C4200: extensión no estándar utilizada: matriz de tamaño cero en struct/union". – Constantin

+0

Ah MSVC. C99 es soportado apropiadamente por gcc, pero no por MSVC. – kennytm

Respuesta

4

En resumen, teóricamente es imposible enviar un mensaje de tamaño variable y recibirlo en un búfer del tamaño perfecto. Tendrá que enviar un primer mensaje con los tamaños de cada cadena y luego un segundo mensaje con las cadenas en sí, o codificar esa metainfo en la carga útil y usar un búfer de recepción estático.

Si debe enviar solo un mensaje, me abstendré de definir un tipo de datos para Pair: en su lugar, crearía un tipo de datos para toda la carga y volcaría todos los datos en un paquete contiguo sin tipo. Luego, en el extremo de recepción puede iterar sobre él, asignando la cantidad exacta de espacio necesaria para cada cadena y rellenándola. Déjame batir un diagrama ASCII para ilustrar. Esta sería su carga:

| ..x1 .. | ..s_len1 .. | .... cadena1 .... | ..x2 .. | ..s_len2 .. | .string2. |. .x3 .. | ..s_len3 ... | ....... string3 ....... | ...

Envía todo en una unidad (por ejemplo, una matriz de MPI_BYTE), entonces el receptor sería descomprimirlo algo como esto:

while (buffer is not empty) 
{ 
    read x; 
    read s_len; 
    allocate s_len characters; 
    move s_len characters from buffer to allocated space; 
} 

Nota sin embargo, que esta solución sólo funciona si la representación de datos de números enteros y caracteres es el mismo en los sistemas de envío y recepción.

+0

Todo en un buffer contiguo es lo que finalmente decidí. Una cosa a tener en cuenta es que tuve que usar MPI_Gather() adicional para recopilar los tamaños de carga de cada proceso. Estos tamaños de carga útil se usaron para calcular el tamaño del buffer de recv y el vector de desplazamiento (http://www.mpi-forum.org/docs/mpi-11-html/node70.html). – Constantin

2

No creo que pueda hacer todo lo que quiera con MPI. Soy un programador de Fortran, así que tengan paciencia si mi comprensión de C es un poco inestable. ¿Desea, al parecer, pasar una estructura de datos que consta de 1 int y 1 cadena (que pasa pasando la ubicación del primer carácter en la cadena) de un proceso a otro? Creo que lo que vas a tener que hacer es pasar una cadena de longitud fija, que debería ser, por lo tanto, tan larga como cualquiera de las cadenas que realmente quieres pasar. El área de recepción para la recopilación de estas cadenas tendrá que ser lo suficientemente grande como para recibir todas las cadenas junto con sus longitudes.

Probablemente quiera declarar un nuevo tipo de datos MPI para sus estructuras; luego puede reunirlos y, dado que los datos recopilados incluyen la longitud de la cadena, recupere las partes útiles de la cadena en el receptor.

No estoy seguro de esto, pero nunca me he encontrado con longitudes de mensaje realmente variables, ya que parece que desea utilizar y se siente como un MPI-like. Pero puede ser algo implementado en la última versión de MPI con el que nunca me he tropezado, aunque ver la documentación en línea no parece ser así.

+0

Esperaba evitar perder espacio con los búferes de longitud fija. Otra opción posible que quería evitar es representar un conjunto de pares len/chars con 2 matrices separadas: una de lentes y otra de caracteres. Gracias de cualquier manera. – Constantin

+0

Mark, hace un tiempo que jugué con MPI, pero estoy bastante seguro de que eres exacto aquí. Al menos para circa 2005 MPI. –

1

Las implementaciones de MPI no inspeccionan ni interpretan los contenidos reales de un mensaje. Siempre que conozca el tamaño de la estructura de datos, puede representar ese tamaño en cierto número de char o int. La implementación de MPI no conocerá ni se preocupará por los detalles internos reales de los datos.

Hay algunas advertencias ... tanto el emisor como el receptor deben estar de acuerdo con la interpretación del contenido del mensaje, y el búfer que usted proporciona en el lado emisor y receptor debe encajar en una cantidad definible de caracteres o int.

Cuestiones relacionadas