C MPI阵列搜索帮助(MPI_Scatter)

时间:2015-05-06 09:40:38

标签: c arrays search mpi

我是使用MPI的新手,我在解决为什么我的代码无法正常运行时遇到了问题。

#include "mpi.h"
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[]) {
    int list_size = 1000
    int threads;
    int th_nums;
    int slice;
    char* the_array[list_size];
    char* temp_array[list_size];
    char str_to_search[10];

    FILE *in = fopen("inputfile", "r");

    char parse[10];

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &threads);
    MPI_Comm_size(MPI_COMM_WORLD, &th_nums);

    if (threads == 0) { // if master task
        fgets(parse, 10, in);
        slice = atoi(parse); // How many slices to cut the array into

        fgets(parse, 10, in);
        sscanf(parse, "%s", search); // gives us the string we want to search

        int i;
        for (i = 0; i < list_size; i++) {
            char temp[10];
            fgets(parse, 10, in);
            sscanf(parse, "%s", temp);
            the_array[i] = strdup(temp);
        }
        int index = list_size/slice; // 
        MPI_Bcast(&str_to_search, 10, MPI_CHAR, 0, MPI_COMM_WORLD);
    }

    MPI_Bcast(&str_to_search, 10, MPI_CHAR, 0, MPI_COMM_WORLD);

    MPI_Scatter(the_array, index, MPI_CHAR, temp_array, index, 0, MPI_COMM_WORLD);

    // Search for string occurs here

    MPI_Finalize();

    return 0;
}

但是,我发现当我尝试搜索时,只有主任务接收到一些切片,其余为空。所有其他任务都没有收到任何东西。我已经尝试将MPI_Scatter置于if(主任务)语句之外,但我没有运气。此外,当list_size增加时,我发现程序基本上卡在MPI_Scatter行。我做错了什么,我该怎么做才能纠正这个问题?

1 个答案:

答案 0 :(得分:2)

你应该去看一些关于MPI集体的教程。他们要求所有流程都参与集体。因此,如果任何进程调用MPI_Scatter,则所有进程都必须调用MPI_Scatter。我建议您查看一些示例代码并使用它,直到您了解正在进行的操作为止。然后尝试回到你自己的代码,看看你是否能弄清楚发生了什么。

我对MPI-3之前的任何内容的最喜欢的参考是DeinoMPI。我从来没有使用过这个实现,但文档很棒,因为它有一个完整的例子来说明MPI-2规范中的每个函数。