Я новичок в программировании MPI. Поэтому я пытаюсь использовать MPI_Scatter для распределения массива char *, которые имеют статический размер в несколько меньших блоков массива char *. Но результат верен только для ID 0, а остальное - значение мусора. Вы знаете, что в этом плохого?Использование MPI_Scatter с char * array
#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 производится правильный кусок массива, но другие идентификаторы, полученные значения мусора.
Я попытался компиляции и тестирования программы с:
модуля нагрузки OpenMPI
КОМП ++ -std = C++ 11 try.cpp -o попробовать
mpirun -np 5 попытка try.txt
где в try.txt:
привет это попытка текстовый документ
снова это попытка текстовый документ
это является Нотис си есть есть это ха-ха
это, вероятно, не поможет, я помню, что столкнулся с подобной проблемой и исправил ее с помощью указателей и 'malloc' вместо массивов. ('char [x] [y] -> char * sublines = malloc (sizeof (char) * x * y)'). единственные другие вещи, которые торчат, удостоверяются, что 'num_processes' определен во время компиляции (в противном случае объявление такого массива недопустимо, невозможно узнать, сколько памяти выделяется) и окончательная проверка работоспособности: вы сделали разброс , ** Вы собрали свои результаты назад **? вы должны [разбегаться и собираться] (http://mpitutorial.com/tutorials/mpi-scatter-gather-and-allgather/);) – sjm324
Пожалуйста, предоставьте [mcve]. – Zulan