2017-02-14 22 views
0

私はmpiについて読んだので、私はMPI_Gather関数の使用に興味があります。正しく使用する方法MPI_Gather?

今、私はこれをやっているが、それは働いていない:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <mpi.h> 

char *funcion (char *a) { 
    sprintf(a, "asdfa%u", 2); 
} 

int main (int argc, char *argv[]) { 

    MPI_Init(&argc, &argv); 
    int rank; 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

    char *parcial = malloc(5*sizeof(char)); 
    char *total; 

    if (rank == 0) { 
     total = malloc(15*sizeof(char)); 
     parcial = "aaaaa"; 
    } 
    else if (rank == 1) { 
     parcial = "bbbbb"; 
    } 
    else if (rank == 2) { 
     parcial = "ccccc"; 
    } 

    MPI_Gather(parcial,5,MPI_CHAR,total,15,MPI_CHAR,0,MPI_COMM_WORLD); 

    if (rank == 0) { 
     printf("%s",total); 
    } 

    MPI_Finalize(); 

} 

代わりの印刷をそれだけで「AAAAA」を印刷しています「aaaaabbbbbccccc」。

私は間違っていますか?

+0

私はちょうど下部にある 'edit'ボタンを使用し、あなたが質問に何かを追加したい場合は、私は3 – Sergio

+0

-npオプションを指定して、それを実行していますことをコメントすることを忘れてしまいました質問の左にある。 – Zulan

答えて

1

recvcountパラメータには、の要素の数を指定します。合計はです。したがって、あなたは以下を使用する必要があります:

MPI_Gather(parcial,5,MPI_CHAR,total,5,MPI_CHAR,0,MPI_COMM_WORLD); 

Cの文字列の理解は根本的に間違いです。

まず、すべてのC文字列は、終端ヌル文字のために追加のバイトを必要とします。したがって、6/16バイトを割り当てる必要があります。ただし、それらのヌルターミネータを送信することはできません。そうでない場合は、マスターの文字列が最初のターミネータで終了します。しかし、文字列を正しく終了させるには、明示的にtotal[15] = 0を設定する必要があります。

は第二に、parcial = "aaaaa"は、代わりにポインタが単に"aaaaa\0"が格納されているメモリ内の別の(書き込み不可)パートに割り当てられている(それがstrncpyによって行われます)あなたのmalloc「Dメモリに文字列をコピーしません。

+0

こんにちは、素敵な説明!私はそれを修正して今働いていますが、私は大きな(あまり)問題を解決したいので、このサンプルコードを実行しました。私はあなたの説明の後で正しく動作させることができると思ったが、私はできなかった、なぜか分からない...あなたが私を助けることを望んでいるリンクを渡す:https://stackoverflow.com/questions/42239222/集まり - 文字列 - mpi-gather-openmpi-cありがとう:) – Sergio

0

これは素敵な作品:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <mpi.h> 

char *funcion (char *a) { 
    sprintf(a, "asdfa%u", 2); 
} 

int main (int argc, char *argv[]) { 

    MPI_Init(&argc, &argv); 
    int rank; 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

    void *total; 
    void *parcial; 

    if (rank == 0) { 
     parcial = "aaaaa"; 
    } 
    else if (rank == 1) { 
     parcial = "bbbbb"; 
    } 
    else if (rank == 2) { 
     parcial = "ccccc"; 
    } 

    MPI_Gather(parcial,5,MPI_CHAR,total,5,MPI_CHAR,0,MPI_COMM_WORLD); 

    if (rank == 0) { 
     printf("%s",(char*)total); 
    } 

    MPI_Finalize(); 

} 
関連する問題