Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Семестровая.doc
Скачиваний:
10
Добавлен:
20.04.2015
Размер:
144.9 Кб
Скачать

2.2 Столбцовый

#include <stdio.h>

#include <stdlib.h>

#include "mpi.h"

unsigned int n=1000;

int main(int argc, char *argv[])

{

MPI_Init(&argc, &argv);

int iRank,iSize;

MPI_Comm_rank(MPI_COMM_WORLD, &iRank);

MPI_Comm_size(MPI_COMM_WORLD, &iSize);

///////////////////

int** iMatrix;

iMatrix=(int**)calloc(n,sizeof(int*));

for(int i=0; i<n; i++)

{

iMatrix[i]=(int*)calloc(n,sizeof(int));

}

if(!iMatrix)

{

printf("Error! Not enough memory");

exit(0);

}

//////////////////

int* iVr;

iVr=(int*)calloc(n,sizeof(int));

if(!iVr)

{

printf("Error! Not enough memory");

exit(0);

}

//////////////////

int* iResult;

iResult=(int*)calloc(n,sizeof(int));

if(!iResult)

{

printf("Error! Not enough memory");

exit(0);

}

//////////////

for(int i=0;i<n;i++)

{

for(int j=0;j<n;j++)

{

iMatrix[i][j]=rand()%11+1;//fill with random numbers

}

}

for(int i=0;i<n;i++)

{

iVr[i]=rand()%11+1;//fill it

}

iResult[0]=0;//Result of computing

double dTimeStart= MPI_Wtime();

for(int i=0;i<n;i++)

{

for(int j=0;j<n;j++)

{

iResult[i]=iResult[i]+iMatrix[i][j]*iVr[j];

}

}

double dTimeFifish=MPI_Wtime();

double r=dTimeFifish-dTimeStart;

printf("%.10f",r);

for(int i=0; i<n; i++)

{

free(iMatrix[i]);

}

free(iMatrix);

free(iVr);

free(iResult);

MPI_Finalize();

return 0;

}

3. Параллельные алгоритмы

3.1 Строковый параллельный

#include <stdio.h>

#include <stdlib.h>

#include "mpi.h"

unsigned int n=1000;

int main(int argc, char *argv[])

{

MPI_Init(&argc, &argv);

int iRank,iSize;

double dTimeStart;

MPI_Comm_rank(MPI_COMM_WORLD, &iRank);

MPI_Comm_size(MPI_COMM_WORLD, &iSize);

///////////////////

int** iMatrix;

iMatrix=(int**)calloc(n,sizeof(int*));

for(int i=0; i<n; i++)

{

iMatrix[i]=(int*)calloc(n,sizeof(int));

}

if(!iMatrix)

{

printf("Error! Not enough memory");

exit(0);

}

//////////////////

int* iVr;

iVr=(int*)calloc(n,sizeof(int));

if(!iVr)

{

printf("Error! Not enough memory");

exit(0);

}

//////////////////

int* iResult;

iResult=(int*)calloc(n,sizeof(int));

if(!iResult)

{

printf("Error! Not enough memory");

exit(0);

}

//////////////

int* iTemp;

iTemp=(int*)calloc(n,sizeof(int));

if(!iTemp)

{

printf("Error! Not enough memory");

exit(0);

} //////////////

for(int i=0;i<n;i++)

{

for(int j=0;j<n;j++)

{

iMatrix[i][j]=rand()%11+1;//fill with random numbers

}

}

for(int i=0;i<n;i++)

{

iVr[i]=rand()%11+1;//fill it

}

iResult[0]=0;//Result of computing

iResult[1]=0;

iResult[2]=0;

iResult[3]=0;

iResult[4]=0;

iResult[5]=0;

if(0==iRank)

dTimeStart= MPI_Wtime();

for(int i=0+iRank;i<n;i+=iSize)

{

for(int j=0;j<n;j++)

{

iMatrix[i][j]=iMatrix[i][j]*iVr[j];

}

}

for(int i=0+iRank;i<n;i+=iSize)

{

for(int j=0;j<n;j++)

{

iTemp[i]=iTemp[i]+iMatrix[i][j];

}

}

MPI_Reduce(iTemp,iResult,n,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);

if(0==iRank)

{

double dTimeFifish=MPI_Wtime();

double r=dTimeFifish-dTimeStart;

printf("%.10f",r);

}

for(int i=0; i<n; i++)

{

free(iMatrix[i]);

}

free(iMatrix);

free(iVr);

free(iResult);

MPI_Finalize();

return 0;

}