- •Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «Кемеровский государственный университет»
- •2. Последовательные алгоритмы
- •2.1 Строковый
- •2.2 Столбцовый
- •3. Параллельные алгоритмы
- •3.1 Строковый параллельный
- •3.2 Столбцовый параллельный
- •4.Таблицы эффективности
- •4.1 Общее время работы
- •4.2 Относительный прирост от многопоточности
- •4.3 Эффективность использования вычислителей
- •4.4 Время на системе с 4 физическими вычислителями и общей памятью
- •5.Заключение
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;
}