Жадная раскраска с помощью MPI C++

имеется следующий код раскраски графа жадным алгоритмом.

#include<iostream>
#include <vector>
#include <mpi.h>

using namespace std;
int v, n, i, j;
vector<vector<int>> g;
vector<int> col;
bool visit[1001];

int id;
int nproc;

int main(int argc, char** argv)
{
    int a, b;
    FILE* myfile;
    //MPI_Status status;
    //MPI_Init(&argc, &argv); // инициализация mpi
    //MPI_Comm_rank(MPI_COMM_WORLD, &id); // получение ранга
    //MPI_Comm_size(MPI_COMM_WORLD, &nproc);   // получение количества процессоров
    //printf("Hello From MPI process: %id, Amount: %d");
    //MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);

    if (id == 0)
    {   
        myfile = fopen("1.txt", "r");
        fscanf(myfile, "%d%d", &n, &v);
        int a, b;
        g.resize(n);
        col.resize(n);
        memset(visit, 0, sizeof(visit));
    }
        for (i = 0; i < v; i++)
        {
            fscanf(myfile, "%d%d", &a, &b);
            a--; b--;
            g[a].push_back(b);
            g[b].push_back(a);
        }


    //int startval = n * id / (nproc);
    //int endval = n * (id + 1) / (nproc);

    col[0] = 0;
    for (i = 1; i < n; i++)
        col[i] = -1;
    bool* unuse = new bool[n];
    for (i = 0; i < n; i++)
        unuse[i] = 0;
    for (i = 1; i < n; i++)
    {
        for (j = 0; j < g[i].size(); j++)
            if (col[g[i][j]] != -1)
                unuse[col[g[i][j]]] = true;

        int cr;
        for (cr = 0; cr < n; cr++)
            if (unuse[cr] == false)
                break;
        col[i] = cr;
        for (j = 0; j < g[i].size(); j++)
            if (col[g[i][j]] != -1)
                unuse[col[g[i][j]]] = false;
    }
    //MPI_Reduce(&p, &, 1, MPI_2INT, MPI_MINLOC, MPI_COMM_WORLD);
    //MPI_Finalize();
    for (i = 0; i < n; i++)
    {
        printf("Vertex %d is coloured with %d \n", i + 1, col[i] + 1);
    }
}

Мне необходимо выполнить распараллеливание между процессами, но с реализацией есть проблемы. Прошу помощи! В данном случае я хочу разделить цикл на части и отдать их каждому процессу. Пытаюсь сделать по аналогии с другими найденными примерами, пока не получается. Я так понимаю, что перед циклами должно быть разделения на части и широковещательная рассылка Bcast, а в конце Reduce(All), где в качестве результата будет массив col.


Ответы (0 шт):