将MPI_Scatter与char *数组一起使用

时间:2017-02-20 07:02:00

标签: c++ mpi

我是MPI编程的新手。所以我试图使用MPI_Scatter将一个具有静态大小的char *数组分发到几个较小的char *数组中。但结果只对ID 0正确,其余的都有垃圾值。你知道它有什么问题吗?

#include "mpi.h"
#include <algorithm>
#include <functional>
#include <cstdlib>
#include <ctime>
#include <cctype>
#include <fstream>
#include <vector>
#include <string>
#include <iostream>
const static int ARRAY_SIZE = 130000;
using Lines = char[ARRAY_SIZE][16];

// To remove punctuations
struct letter_only: std::ctype<char> 
{
    letter_only(): std::ctype<char>(get_table()) {}

    static std::ctype_base::mask const* get_table()
    {
        static std::vector<std::ctype_base::mask> 
            rc(std::ctype<char>::table_size,std::ctype_base::space);

        std::fill(&rc['A'], &rc['z'+1], std::ctype_base::alpha);
        return &rc[0];
    }
};


int main(int argc, char* argv[]) {
    int processId;
    int fillarraycount=0;
    int num_processes;

    // Setup MPI
    MPI_Init( &argc, &argv );
    MPI_Comm_rank( MPI_COMM_WORLD, &processId);
    MPI_Comm_size( MPI_COMM_WORLD, &num_processes);

    Lines lines;
    // Read the input file and put words into char array(lines)
    if (processId == 0) {
        std::ifstream file;
        file.imbue(std::locale(std::locale(), new letter_only()));
        file.open(argv[1]);
        std::string workString;
        int i = 0;
        while(file >> workString){
            memset(lines[i], '\0', 16);
            memcpy(lines[i++], workString.c_str(), workString.length());
            fillarraycount++;
        }
    }
    int n =fillarraycount/num_processes;
    char sublines[n][16];

    MPI_Scatter(lines,n*16,MPI_CHAR,sublines,n*16,MPI_CHAR,0,MPI_COMM_WORLD);
    std::cout<< processId<<" ";
    for(int i=0;i<n;++i)
        std::cout<<sublines[i]<<" ";
    std::cout<<std::endl;

    MPI_Finalize();
    return 0;
}

我知道在此之后我也必须使用MPI_gather,但我很困惑为什么ID 0上的子行产生了正确的数组块,但其他ID产生了垃圾值。

我尝试用以下方法编译和测试程序:
模块加载openmpi
mpic ++ -std = c ++ 11 try.cpp -o try
mpirun -np 5尝试try.txt

在try.txt中的位置:
    你好,这是试文文件
    再次这是试文文件
    is is is is is is is is is ha ha

1 个答案:

答案 0 :(得分:0)

在0以外的等级上,n为0,因为fillarraycount永远不会递增。如果fillarraycount是动态的,则必须首先向所有等级广播ist。