0

我在 global_filetable 中有 4 个文件路径,我试图将 2 个堆路径分散到每个进程。

进程 0 有正确的 2 条路径,但进程 1 中有一些奇怪的东西(空)......

编辑:这是完整的代码:

#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*global 和 local filetables 使用连续内存。根据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);

请注意,没有更多的位移,每个等级只会获得相同大小的连续内存块。

下一步是定义一个封装PATH_MAX字符的 C 和 MPI 结构,这样您就可以摆脱不断使用PATH_MAX和粗略的索引。

我认为这比使用实际char**的 . 只有当内存浪费或冗余数据传输成为问题时,您才需要这样做。

PATH_MAX - 1PS 确保在条目中输入的字符数不要超过,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 回答