- •Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «Кемеровский государственный университет»
- •2. Последовательные алгоритмы
- •2.1 Строковый
- •2.2 Столбцовый
- •3. Параллельные алгоритмы
- •3.1 Строковый параллельный
- •3.2 Столбцовый параллельный
- •4.Таблицы эффективности
- •4.1 Общее время работы
- •4.2 Относительный прирост от многопоточности
- •4.3 Эффективность использования вычислителей
- •4.4 Время на системе с 4 физическими вычислителями и общей памятью
- •5.Заключение
3.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;
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 j=0;j<n;j++)
{
for(int i=iRank;i<n;i+=iSize)
{
iTemp[i]=iTemp[i]+iMatrix[i][j]*iVr[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;
}
4.Таблицы эффективности
4.1 Общее время работы
|
1000х1000 |
2000х2000 |
3000х3000 |
4000х4000 |
5000х5000 |
Строковый последова-тельный |
0,0135 |
0,0546 |
0,1237 |
0,2191 |
0,3445 |
Столбцовый последова-тельный |
0,0076 |
0,0313 |
0,0704 |
0,1253 |
0,1988 |
Строковый параллельный Х2 |
0,0072 |
0,0276 |
0,0621 |
0,1127 |
0,1753 |
Строковый параллельный Х4 |
0,0039 |
0,0160 |
0,0337 |
0,0562 |
0,0877 |
Строковый параллельный Х6 |
0,0038 |
0,0093 |
0,0220 |
0,0375 |
0,0585 |
Столбцовый Параллельный Х2 |
0,0073 |
0,0306 |
0,0704 |
0,1275 |
0,2054 |
Столбцовый Параллельный Х4 |
0,0066 |
0,0180 |
0,0399 |
0,0693 |
0,1028 |
Столбцовый Параллельный Х6 |
0,0055 |
0,0167 |
0,0347 |
0,0532 |
0,0761 |
4.2 Относительный прирост от многопоточности
|
Строчный Х2 |
Строчный Х4 |
Строчный Х6 |
Стоблцов ый Х2 |
Стоблцов ый Х4 |
Стоблцов ый Х6 |
1000х1000 |
1,875 |
3,461 |
3,461 |
1,041 |
1,151 |
1,381 |
2000х2000 |
1,978 |
3,412 |
5,87 |
1,022 |
1,738 |
1,874 |
3000х3000 |
1,991 |
3,67 |
5,622 |
1 |
1,764 |
2,028 |
4000х4000 |
1,944 |
3,898 |
5,842 |
0,982 |
1,808 |
2,355 |
5000х5000 |
1,965 |
3,928 |
5,888 |
0,967 |
1,942 |
2,612 |