【问题标题】:C MPI Array Search Help (MPI_Scatter)C MPI 数组搜索帮助 (MPI_Scatter)
【发布时间】:2015-07-16 08:51:07
【问题描述】:

我是使用 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(master task) 语句之外,但我对此并不走运。此外,当 list_size 增加时,我发现程序基本上卡在 MPI_Scatter 行。我做错了什么,我能做些什么来纠正这个问题?

【问题讨论】:

    标签: c arrays search mpi


    【解决方案1】:

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

    对于 MPI-3 之前的任何内容,我最喜欢的参考是 DeinoMPI。我从未使用过该实现,但文档很棒,因为它为 MPI-2 规范中的每个函数提供了完整的示例。

    【讨论】:

    • 感谢您的帮助,我现在明白为什么每个进程都调用 MPI_Scatter 了。但是,我发现运行 ID 为 0 的进程运行良好,但是当我进入其他进程时,我遇到了很大的分段错误。我现在要做的就是打印 temp_array 的第一个元素。在做 MPI_Scatter 时,来自每个进程的 temp_array 应该有来自 the_array 的元素,但它们没有并导致分段错误。这是为什么呢?
    • 我必须查看代码来帮助解决这个问题。你应该问一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 2011-04-11
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 2011-04-20
    • 2017-08-22
    相关资源
    最近更新 更多