2017-12-06 2 views
2

ist es möglich, Anordnung von Zeichenketten alsMPI Broadcast Array von Zeichenketten

char **lines; 
lines = malloc(512 * sizeof(char*)); 

definiert auszustrahlen habe ich versucht,

MPI_Bcast(lines, linesCount, MPI_BYTE, 0, MPI_COMM_WORLD); 

und

MPI_Bcast(lines, linesCount, MPI_CHAR, 0, MPI_COMM_WORLD); 

wo linesCount ist Anzahl der Saiten in Array.

Wie kann es erreicht werden?

+0

Strings können ein bisschen speziell sein, aber sie sind nur eine Reihe von Zeigern. Schauen Sie sich [diese Frage] an (https://stackoverflow.com/questions/9507987/mpi-sending-array-of-array). Es gibt auch dieses [(nicht richtig beantwortete) Duplikat] (https://stackoverflow.com/questions/19744458/sending-string-array-mpi-c) – Zulan

Antwort

1

die Saiten Unter der Annahme, dass Sie speichern in der lines Array kann eine veränderliche Größe haben, können Sie zuerst ein int-Array von Größen der einzelnen Strings übertragen und dann jede Saite einzeln übertragen,

/* Create an Array with length of each line 
    Broadcast it from process 0 */ 
int lin_siz[linesCount]; 
if (p_rank == 0) 
    for (i=0; i < linesCount; i++) 
     lin_siz[i] = strlen(lines[i])+1; 
MPI_Bcast(&lin_siz, linesCount, MPI_INT, 0, MPI_COMM_WORLD); 

/* Broadcast each line */ 
for (i=0; i < linesCount; i++) 
    MPI_Bcast(&lines[i], lin_siz[i], MPI_CHAR, 0, MPI_COMM_WORLD); 

MPI_Bcast kann nur übertragen Elemente, die zusammenhängend im Speicher sind - in diesem Fall das int-Array mit Größen, lin_siz und jede Zeile in lines gespeichert. Dies ist möglicherweise keine sehr elegante Lösung und besser ist sicherlich möglich, aber es funktioniert.

Es wurde mit der folgenden Array getestet

char **lines; 
lines = malloc(linesCount * sizeof(char*)); 

if (p_rank == 0){ 
    for (i=0; i<linesCount-2; i++) 
     lines[i] = "This is a test."; 
    lines[i++] = "More testing."; 
    lines[i++] = "Even more.."; 
} 

mit p_rankMPI_Comm_rank(MPI_COMM_WORLD, &p_rank) mit einem Standardprozessor rank erhalten werden. Und erfolgreich am Ende als

/* Print */ 
printf("Process rank %d:\n", p_rank); 
for (i=0; i < linesCount; i++) 
    printf("%s\n", lines[i]); 

Ich kann den gesamten Testfall buchen, wenn Sie Probleme bei der Umsetzung meiner Antwort haben.