Skip to content
Snippets Groups Projects
mpitest.cpp 1.91 KiB
Newer Older
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
#include <mpi.h>
#include <vector>
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
#include <iostream>
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
#include "datastructures/Body.hpp"

typedef struct _A {
	int num;
	float x;
	double data[4];
} A;

using namespace nbody;
using namespace std;

Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
int main(int argc, char** argv) {
	int blocklengths[3] = {1, 1, 4};
	MPI::Datatype datatypes[3] = {MPI::INT, MPI::FLOAT, MPI::DOUBLE};
	MPI::Aint displacements[3];
	MPI::Datatype restype = MPI::DATATYPE_NULL;
	MPI::Aint intex;
	MPI::Aint floatex;
	MPI::Aint intlb;
	MPI::Aint floatlb;
	MPI::Init(argc, argv);
	datatypes[0].Get_extent(intlb, intex);
	datatypes[1].Get_extent(floatlb, floatex);
	displacements[0] = (MPI::Aint) 0;
	displacements[1] = intex;
	displacements[2] = intex + floatex;
	restype = restype.Create_struct(3, blocklengths, displacements, datatypes);
	restype.Commit();

	if (MPI::COMM_WORLD.Get_rank() == 0) {
		for (int j = 0; j < 4; j++) {
			a[j].num = j * 10.0 + 1;
			a[j].x = j * 10.0 + 2.0;
			for (int i = 0; i < 4; i++) {
				a[j].data[i] = j * 10.0 + a[j].x + 1 + i;
			}
		MPI::COMM_WORLD.Send(&a[0], 4, restype, 1, 0);
	} else if (MPI::COMM_WORLD.Get_rank() == 1) {
		MPI::COMM_WORLD.Recv(&a[0], 4, restype, 0, 0);
		for (int j = 0; j < 4; j++) {
			cout << a[j].num << " " << a[j].x << " ";
			for (int i = 0; i < 4; i++) {
				cout << a[j].data[i] << " ";
			}
			cout << endl;

	if (MPI::COMM_WORLD.Get_rank() == 0) {
		for (int i = 0; i < 16; i++) {
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
			Body b((double) i, (double) i, (double) i);
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
			data[i] = b;
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
		if (MPI::COMM_WORLD.Get_rank() == 0) {
			for (int i = 0; i < 16; i++) {
				cout << MPI::COMM_WORLD.Get_rank() << " " <<  data[i].position[0] << endl;
			}
		}
	} else {
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
		for (int i = 0; i < 16; i++) {
			Body b((double) 0, (double) 0, (double) 0);

			data[i] = b;
		}
		if (MPI::COMM_WORLD.Get_rank() != 0) {
			for (int i = 0; i < 16; i++) {
				cout << MPI::COMM_WORLD.Get_rank() << " " <<  data[i].position[0] << endl;
			}
		}
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
	return 0;
}