Как правильно использовать функцию MPI_Reduce? - PullRequest
0 голосов
/ 14 декабря 2018

Я новичок в C ++, а также MPI, поэтому у меня есть некоторые проблемы.

В моем коде процесс 0 читает текстовые файлы (burcu - имя файла, алфавит - все буквы в алфавите) и преобразует файл имени в массив чисел.С помощью MPI_Bcast я распределяю количество букв между различными процессами, и эти подчиненные процессы выполняют некоторые арифметические операции.В конце, используя MPI_Reduce, я собираю результат этих арифметических операций (который является xnum) в weightednum в процессе 0.

Проблема заключается в том, что я запускаю код, хотя значения xnum верны, weightednumимеет странный результат, такой как 939605 (это должно быть 215, что является суммой значений xnum).Что может быть причиной этого неверного результата?Мой код выглядит следующим образом:

int main (int  argc, char **argv) {

int myid, nprocs;
int *countname, xnum, weightednum;
char *burcu, *alfabe;

MPI_Init (&argc, &argv);

MPI_Comm_rank (MPI_COMM_WORLD, &myid);
MPI_Comm_size (MPI_COMM_WORLD, &nprocs);
int size = 5;
countname = new int[size];
burcu = new char[5];
alfabe = new char[26];

char name[5];
char alphabet[26];


MPI_Reduce(&xnum, &weightednum, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);

if (myid == 0) {

    cout << "wn" << weightednum ;

    // Read myname.txt file and convert it to a string

    ifstream input("myname.txt");
    for (int i = 1; i < 6; i++){

        input >> name;
        cout << name;
        burcu[i] = *name;   
    }


    // Read alhabet.txt file and convert it to a string


    ifstream input1("alphabet.txt");

    for (int i = 1; i < 27; i++){

        input1 >> alphabet;
        cout << alphabet;
        alfabe[i] = *alphabet;  
    }

     for (int i = 1; i <= 5; i++){ 

        for (int j = 1; j<= 26; j++){

            if (alfabe[j] == burcu[i]){

                countname[i] = j;
                break;
            } 

        }

        cout << countname[i] << " ";        
    }

    input.close();
    input1.close();



}

    // Send name and alphabet strings to all processors by means of broadcasting

    MPI_Bcast(countname, 6, MPI_INT, 0, MPI_COMM_WORLD);    

if (myid != 0){

    // All processors receive the same messages, and they will take only one letter of your name

    //xnum = myid;
    xnum = countname[myid]*myid; 
    cout << "xnum:" << xnum;        
}


MPI_Finalize();
return 0;

Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...