'Неверный тип данных в MPI_Type_Struct.Программа компилируется, но при запуске выдает вышеуказанную ошибку - PullRequest
0 голосов
/ 02 июня 2019

Я создаю структуру, и мне нужно разбросать массив пользовательских типов данных, чтобы сделать расчет. Я пытаюсь создать структуру цветного света, которая имеет 7 параметров. Есть 5 огней, которые посылают сигналы трафика каждые 5 минут. После часа чтения 60 часов вычисляется наиболее перегруженная область. В настоящее время у меня возникают проблемы с созданием пользовательских типов данных. Если есть намного лучшие и продуктивные способы решения этой задачи, предложения приветствуются

#include <stdio.h>
#include <iostream>
#include <mpi.h>
#include <string>
#include <stdlib.h>
#include <fstream>
#include <stddef.h>

#define size 5     //number of Colour lights

using namespace std;

struct Light{
    int id;
    int traffic;
    int hour;
    int min;
    int day;
    int month;
    int year;
};

int count = 0;

//const int size = 5;

Light lights[size*12] = {0};


int main()
{
/*
    //writing sample data to the file

    std::ofstream outfile;
    outfile.open("trafficInfo.txt");

    int a = 0;
    int mini = 0;

    for(int i = 0; i < size * 12 ; i++){

        if(a == size)
            a = 0;


        if(mini == 59)
            mini = 0;

        outfile << a <<"        "<< (a+1)*10 << "   11  " << mini << "  3   " << "  6   " << "  2019" << endl;

        mini++;
        a++;
    }

    outfile.close();
*/
    MPI_Init(NULL , NULL);

    int numP = 0;
    MPI_Comm_size(MPI_COMM_WORLD , &numP);

    int rank = 0;
    MPI_Comm_rank(MPI_COMM_WORLD , &rank);

    int elementsPerProc = ((size*12)+numP)/numP;

    Light gatherLights[elementsPerProc] = {0};



    if(rank == 0)
    {      
        ifstream theFile("trafficInfo.txt");

        int lId , lTraffic , lHour , lMin , lDay, lMonth , lYear;

        int cc = 0; //to increment the array by 1 every iteration

        while(theFile >>lId >> lTraffic >> lHour >> lMin >> lDay >> lMin >> lYear)
        {
            Light tempLight;

            tempLight.id = lId;
            tempLight.traffic = lTraffic;
            tempLight.hour = lHour;
            tempLight.min = lMin;
            tempLight.day = lDay;
            tempLight.month = lMonth;
            tempLight.year = lYear;

            lights[cc] = tempLight;

            if(count == size)
                    count = 0;

            cc++;
            count++;

        }

        int numEls = size * 12;

        int blocklengths[7] = {1,1,1,1,1,1,1};
        MPI_Aint offsets[7] , extent;
        MPI_Datatype types[1];

        types[1] ={MPI_INT};
        types[2] ={MPI_INT};
        types[3] ={MPI_INT};
        types[4] ={MPI_INT};
        types[5] ={MPI_INT};
        types[6] ={MPI_INT};
        types[0] ={MPI_INT};

        MPI_Datatype mpi_Light;

        offsets[0] = offsetof(Light, id);
        offsets[1] = offsetof(Light, traffic);
        offsets[2] = offsetof(Light, hour);
        offsets[3] = offsetof(Light, min);
        offsets[4] = offsetof(Light, day);
        offsets[5] = offsetof(Light, month);
        offsets[6] = offsetof(Light, year);

        MPI_Type_create_struct(7 , blocklengths , offsets , types, &mpi_Light);
        MPI_Type_commit(&mpi_Light);

        Light recv[elementsPerProc];

        MPI_Scatter(&lights , elementsPerProc , mpi_Light , MPI_IN_PLACE ,elementsPerProc, mpi_Light , 0 , MPI_COMM_WORLD);
        MPI_Barrier(MPI_COMM_WORLD);

        cout << "Rank is :" << rank << endl;


        MPI_Gather(MPI_IN_PLACE, elementsPerProc, mpi_Light , &gatherLights , elementsPerProc, mpi_Light , 0 , MPI_COMM_WORLD);
        MPI_Barrier(MPI_COMM_WORLD);
    }
    else
    {
        MPI_Scatter(NULL , elementsPerProc , MPI_INT , &lights ,elementsPerProc, MPI_INT , 0 , MPI_COMM_WORLD);
        MPI_Barrier(MPI_COMM_WORLD);

        cout << "Rank is :" << rank << endl;

        MPI_Gather(gatherLights, elementsPerProc, MPI_INT , &gatherLights , elementsPerProc, MPI_INT , 0 , MPI_COMM_WORLD);
        MPI_Barrier(MPI_COMM_WORLD);

    }

    MPI_Finalize();

    return 0;
}
...