0

global_filetable に 4 つのファイルパスがあり、各プロセスに 2 つのパイルパスを分散させようとしています。

プロセス 0 には適切な 2 つのパスがありますが、プロセス 1 (null) に何か問題があります...

編集:完全なコードは次のとおりです。

#include <stdio.h>
#include <limits.h> // PATH_MAX
#include <mpi.h>

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

    char** global_filetable = (char**)malloc(4 * PATH_MAX * sizeof(char));
    for(int i = 0; i < 4; ++i) {
        global_filetable[i] = (char*)malloc(PATH_MAX *sizeof(char));
        strncpy (filetable[i], "/path/", PATH_MAX);
    }

    /*for(int i = 0; i < 4; ++i) {
        printf("%s\n", global_filetable[i]);
    }*/

    int rank, size;

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    char** local_filetable = (char**)malloc(2 * PATH_MAX * sizeof(char));

    MPI_Scatter(global_filetable, 2*PATH_MAX, MPI_CHAR, local_filetable, 2*PATH_MAX , MPI_CHAR, 0, MPI_COMM_WORLD);
    {

        /* now all processors print their local data: */
        for (int p = 0; p < size; ++p) {
            if (rank == p) {
                printf("Local process on rank %d is:\n", rank);
                for (int i = 0; i < 2; i++) {
                    printf("path: %s\n", local_filetable[i]);
                }
            }
            MPI_Barrier(MPI_COMM_WORLD);
        }
    }

    MPI_Finalize();
    return 0;
}

出力:

Local process on rank 0 is:
path: /path/
path: /path/
Local process on rank 1 is:
path: (null)
path: (null)

なぜ私がこれらのヌルを持っているのか分かりますか?

4

2 に答える 2

1

まず、割り当てに一貫性がありません。

char** local_filetable = (char**)malloc(2 * PATH_MAX * sizeof(char));

タイプchar**は の配列を示しchar*ますが、連続したメモリ ブロックを割り当てます。これはchar*.

char*最も簡単な方法は、グローバルとローカルの両方で連続したメモリを使用することfiletableです。実際の動作によってget_filetable()は、変換する必要がある場合があります。次に、次のようにインデックスを付けることができます。

char* entry = &filetable[i * PATH_MAX]

次に、次のように簡単に散布できます。

MPI_Scatter(global_filetable, 2 * PATH_MAX, MPI_CHAR,
            local_filetable, 2 * PATH_MAX, MPI_CHAR, 0, MPI_COMM_WORLD);

これ以上変位がないことに注意してください。すべてのランクは、連続したメモリの同じサイズのチャンクを取得するだけです。

次のステップは、文字をカプセル化する C および MPI 構造体を定義することです。これにより、粗雑な索引付けPATH_MAXの絶え間ない使用を取り除くことができます。PATH_MAX

これは実際のchar**. メモリの浪費または冗長なデータ転送が問題になる場合にのみ必要です。

PS末尾のスペースを確保するために、エントリに を超えるPATH_MAX - 1文字を入力しないようにしてください。filetable\0

于 2016-04-04T11:32:10.727 に答える
0

わかりました、私は愚かです。

char global_filetable[NUMBER_OF_STRINGS][PATH_MAX];

for(int i = 0; i < 4; ++i) {
    strcpy (filetable[i], "/path/");
}
char local_filetable[2][PATH_MAX];

今それは動作します!

于 2016-04-04T16:31:17.907 に答える