BubbleSort в C ++ с использованием MPI - PullRequest
0 голосов
/ 18 апреля 2020

Я новичок в MPI и пытаюсь написать код сортировки (BubbleSort). Код работает, но кажется, что я что-то упускаю

Код здесь: --->

#define N 10`
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
#include <stddef.h>
#include "mpi.h"
using namespace std;


int main(int argc, char* argv[])
{
    int i, j, k, rank, size;
    int a[N] = { 10,9,8,7,6,5,4,3,2,1 };
    int c[N];
    int aa[N], cc[N];

    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    MPI_Scatter(a, N/size, MPI_INT, aa, N/size , MPI_INT, 0, MPI_COMM_WORLD);

    MPI_Barrier(MPI_COMM_WORLD);

    int n = N/size;
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (aa[j] > aa[j + 1]) {
                int temp = aa[j];
                aa[j] = aa[j + 1];
                aa[j + 1] = temp;
            }
        }
    }
    for (int i = 0; i < n; i++) {
        cc[i] = aa[i];
    };

    MPI_Barrier(MPI_COMM_WORLD);
    MPI_Gather(cc, N/size , MPI_INT, c, N/size, MPI_INT, 0, MPI_COMM_WORLD);

    MPI_Barrier(MPI_COMM_WORLD);
    MPI_Finalize();
    cout << cc[9];
    if (rank == 0) {
        cout << "C is look like : " << endl;
        for (int i = 0; i < N; i++) {
            cout << c[i] << "   ";

        }
    }
}

Вывод программы: -> В итоге мы получаем ошибки. В общем, мой MPI настроен как 4 процессора

-858993460 C is look like :
-858993460
-858993460
-858993460
9   10   7   8   5   6   3   4   -858993460   -858993460

1 Ответ

1 голос
/ 18 апреля 2020

В вашей программе есть несколько проблем:

  • cc[9] используется неинициализированным
  • вы работаете только с (N/size)*size) элементами, а в вашем случае N=10, size=4 это означает, что вы работаете только на 8 элементах. Суть в том, чтобы использовать MPI_Scatterv() и MPI_Gatherv()
  • при условии, что ваша пузырьковая сортировка верна (я не проверял эту часть), ваша программа собирает отсортированные (под) массивы, и вы не можете наивно ожидать, что результат будет отсортированный массив (полный размер).
...