Я создаю структуру, и мне нужно разбросать массив пользовательских типов данных, чтобы сделать расчет. Я пытаюсь создать структуру цветного света, которая имеет 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;
}