Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "mpi.h"
- #include "iostream"
- #include "iomanip"
- using namespace std;
- double** mtrxInit(int n) {
- double** mtrx = new double*[n];
- for (int i = 0; i < n; i++) {
- mtrx[i] = new double[n];
- for (int j = 0; j < n; j++) {
- mtrx[i][j] = 0;
- }
- }
- return mtrx;
- }
- double** mtrxInitFrom(double** mtrx, int n)
- {
- double** res = mtrxInit(n);
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < n; j++)
- {
- res[i][j] = mtrx[i][j];
- }
- }
- return res;
- }
- void mtrxSumm(double** mtrx1, double** mtrx2, int n) {
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- mtrx1[i][j] += mtrx2[i][j];
- }
- }
- }
- void mtrxMult(double** mtrx1, double** mtrx2, int n) {
- double** res = mtrxInit(n);
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- for (int k = 0; k < n; k++) {
- res[i][j] += mtrx1[i][k] * mtrx2[k][j];
- }
- }
- }
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- mtrx1[i][j] = res[i][j];
- }
- delete res[i];
- }
- delete[] res;
- }
- void mtrxMult(double** mtrx, double a, int n) {
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- mtrx[i][j] *= a;
- }
- }
- }
- void mtrxShow(double** mtrx, int n) {
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- cout << mtrx[i][j] << " ";
- }
- cout << endl;
- }
- cout << endl;
- }
- double mtrxElSumm(double** mtrx, int n) {
- double res = 0;
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- res += mtrx[i][j];
- }
- }
- return res;
- }
- double* packBuf2(double** tmtrx, int n) {
- double* pack = new double[n*n];
- int l = 0;
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- pack[l] = tmtrx[i][j];
- l++;
- }
- }
- return pack;
- }
- double** unpackBuf2(double* pack, int n) {
- double** tmtrx = new double*[n];
- int l = 0;
- for (int i = 0; i < n; i++) {
- tmtrx[i] = new double[n];
- for (int j = 0; j < n; j++) {
- tmtrx[i][j] = pack[l];
- l++;
- }
- }
- return tmtrx;
- }
- double** mtrxIcalc(double** mtrx, int n, int size, int rank) {
- double** res = mtrxInitFrom(mtrx, n);
- for (int i = 1; i < size; i++) {
- mtrxMult(res, mtrx, n);
- }
- return res;
- }
- double** mtrxRinit(double** mtrx, int n, int rank) {
- double** imatrx = mtrxInit(n);
- for (int i = 0; i < n; i++) {
- imatrx[i][i] = 1.0;
- }
- for (int i = 0; i < rank; i++) {
- mtrxMult(imatrx, mtrx, n);
- mtrxMult(imatrx, 1.0 / (i + 1), n);
- }
- return imatrx;
- }
- void expanent2() {
- int rank;
- int size;
- MPI_Status st;
- MPI_Comm_rank(MPI_COMM_WORLD, &rank);
- MPI_Comm_size(MPI_COMM_WORLD, &size);
- double startTime = MPI_Wtime();
- //степень
- int nt = 100000;
- //init matrx
- int n = 25;
- double** mtrx = mtrxInit(n);
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- mtrx[i][j] = i*(i == j);
- }
- }
- //
- double** cmtrxt = mtrxIcalc(mtrx, n, size, rank);
- double** imtrx = mtrxRinit(mtrx, n, rank);
- double** summ = mtrxInitFrom(imtrx, n);
- for (int i = size + rank; i < nt; i = i + size) {
- mtrxMult(imtrx, cmtrxt, n);
- double cont = 1.0;
- for (int j = 0; j < size; j++) {
- cont = cont*(i - j);
- }
- mtrxMult(imtrx, 1.0 / cont, n);
- mtrxSumm(summ, imtrx, n);
- }
- double* reciveBuf = new double[n*n];
- double* sendBuf = packBuf2(summ, n);
- MPI_Reduce(sendBuf, reciveBuf, n*n, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
- if (rank == 0) {
- double** result = unpackBuf2(reciveBuf, n);
- mtrxShow(result, n);
- for (int i = 0; i < n; i++) {
- delete result[i];
- }
- delete[] result;
- }
- double endTime = MPI_Wtime();
- if (rank == 0) {
- cout << "time | " << endTime - startTime << endl;
- }
- for (int i = 0; i < n; i++) {
- delete[] cmtrxt[i];
- delete[] imtrx[i];
- delete[] summ[i];
- }
- delete[] cmtrxt;
- delete[] imtrx;
- delete[] summ;
- delete[] reciveBuf;
- delete[] sendBuf;
- }
- int main(int argc, char** argv) {
- MPI_Init(&argc, &argv);
- expanent2();
- MPI_Finalize();
- /*
- int data;
- cin >> data;*/
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement