#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#define IDIM 4
#define IHILOS 4
int aDim[] = { 100, 500, 1000, 5000 };
int iIter = 10;
double aRes[IDIM][4];
int iHilos = 1;
void leer(double*,int);
int iPosicion(int, int, int);
double dInvertirPara(double*, double*, int, int );
double dInvertirSecu(double* , double* , int , int );
int main(){
FILE * f;
iHilos = omp_get_max_threads();
for( int i=0; i<IDIM; i++) {
int a;
printf("********************ITERACION %i********************\n",i+1);
//Matriz secuencial
double *dMatrizSec = (double *) malloc(IDIM*IDIM*sizeof(double));
double *dInversaSec = (double *) malloc(IDIM*IDIM*sizeof(double));
//Matriz paralela
double *dMatrizParalelo = (double *) malloc(IDIM*IDIM*sizeof(double));
double *dInversaParalelo = (double *) malloc(IDIM*IDIM*sizeof(double));
for( int f=0; f<IDIM; f++ ) {
for( int c=0; c<IDIM; c++ ) {
dMatrizSec[ iPosicion(f,c,IDIM) ] = 1 + rand() % (11 - 1);
dMatrizParalelo[ iPosicion(f,c,IDIM) ] = dMatrizSec[ iPosicion(f,c,IDIM) ];
if ( f == c ){
dInversaSec[ iPosicion(f,c,IDIM) ] = 1.0;
dInversaParalelo [ iPosicion(f,c,IDIM) ] = 1.0;
}
else{
dInversaSec[ iPosicion(f,c,IDIM) ] = 0.0;
dInversaParalelo [ iPosicion(f,c,IDIM) ] = 0.0;
}
}
}
aRes[i][0] = 0.0;
aRes[i][1] = 0.0;
aRes[i][2] = 0.0;
aRes[i][3] = 0.0;
// Procesamiento secuencial
printf("********************PROCESAMIENTO SECUENCIAL********************\n");
printf("MATRIZ\n");
leer (dMatrizSec,IDIM);
printf("MATRIZ IDENTIDAD\n");
leer (dInversaSec,IDIM);
aRes[i][0] += dInvertirSecu(dMatrizSec,dInversaSec,IDIM,1);
printf("MATRIZ DESPUES DE INVERTIR\n");
leer (dInversaSec,IDIM);
printf("MATRIZ IDENTIDAD DESPUES DE INVERTIR\n");
leer (dMatrizSec,IDIM);
// Procesamiento paralelo
printf("********************PROCESAMIENTO PARALELO********************\n");
printf("MATRIZ \n");
leer (dMatrizParalelo,IDIM);
printf("MATRIZ IDENTIDAD\n");
leer (dInversaParalelo,IDIM);
aRes[i][1] += dInvertirPara(dMatrizParalelo,dInversaParalelo,IDIM,iHilos);
printf("MATRIZ DESPUES DE INVERTIR\n");
leer (dInversaParalelo,IDIM);
printf("MATRIZ IDENTIDAD DESPUES DE INVERTIR\n");
leer (dMatrizParalelo,IDIM);
aRes[i][2] = aRes[i][0]/aRes[i][1];
aRes[i][3] = aRes[i][1]/iHilos;
}
printf("\n \n");
printf("TIEMPOS DE PROCESAMIENTO\n");
for(int i=0;i<IDIM; i++){
printf("\n=================================\n");
printf("\nTiempo de ejecucion secuencial: %f",aRes[i][0]);
printf("\nTiempo de ejecucion paralelo: %f",aRes[i][1]);
printf("\nSecuencial/Paralelo: %f",aRes[i][2]);
printf("\nTiempo por cada hilo: %f",aRes[i][3]);
}
//Guardar tabla en un csv
f = fopen("Comparativa.csv","w"); //Se le dara el nombre de "Comparativa.csv"
if(f == NULL){
perror("Error:No se creo la tabla"); // se muestra mensaje de error
}
else{
// Tabla de rendimiento
fprintf(f,"SECUENCIAL : PARALELO : SEC/PAR : HILO\n");
for(int i=0;i<IDIM; i++){
fprintf(f,"%f,%f,%f,%f\n",aRes[i][0],aRes[i][1],aRes[i][2],aRes[i][3]);
}
fflush(f); //limpiar buffer del teclado
fclose(f);//Cerrar el archivo
}
return 0;
}
// Esta función mostrará los valores de la matriz
void leer (double* Matriz, int iDim){
for(int i = 0; i < iDim; i++){
for(int j = 0; j < iDim; j++){
printf("%.2f ",Matriz[iPosicion(i,j,IDIM)]); //solo mostrará dos decimales por la indicación %.2f
}
printf("\n");
}
}
int iPosicion(int fila, int columna, int dimension) {
return fila*dimension + columna;
}
//Procesamiento PARALELO
double dInvertirPara(double* dMat, double* dInv, int iDim, int iHilos ) {
double dDur;
omp_set_num_threads(iHilos);
dDur = omp_get_wtime();
double pivote, aux;
for(int i=0;i < IDIM; i++){
pivote = dMat[iPosicion(i,i,IDIM)];
#pragma omp parallel for
for(int k = 0; k < IDIM; k++){
dMat[iPosicion(i,k,IDIM)] = dMat[iPosicion(i,k,IDIM)] / pivote;
dInv[iPosicion(i,k,IDIM)] = dInv[iPosicion(i,k,IDIM)] / pivote;
}
for(int j = 0; j < IDIM; j++){
if(i != j){
aux = dMat[iPosicion(j,i,IDIM)];
#pragma omp parallel for
for(int k = 0; k < IDIM; k++){
dMat[iPosicion(j,k,IDIM)] = dMat[iPosicion(j,k,IDIM)] - aux * dMat[iPosicion(i,k,IDIM)];
dInv[iPosicion(j,k,IDIM)] = dInv[iPosicion(j,k,IDIM)] - aux * dInv[iPosicion(i,k,IDIM)];
}
}
}
}
dDur = omp_get_wtime() - dDur;
return dDur;
}
//Procesamiento SECUENCIAL
double dInvertirSecu(double* dMat, double* dInv, int iDim, int iHilos ) {
double dDur;
omp_set_num_threads(iHilos);
dDur = omp_get_wtime();
double pivote, aux;
for(int i=0;i < IDIM; i++){
pivote = dMat[iPosicion(i,i,IDIM)];
for(int k = 0; k < IDIM; k++){
dMat[iPosicion(i,k,IDIM)] = dMat[iPosicion(i,k,IDIM)] / pivote;
dInv[iPosicion(i,k,IDIM)] = dInv[iPosicion(i,k,IDIM)] / pivote;
}
for(int j = 0; j < IDIM; j++){
if(i != j){
aux = dMat[iPosicion(j,i,IDIM)];
for(int k = 0; k < IDIM; k++){
dMat[iPosicion(j,k,IDIM)] = dMat[iPosicion(j,k,IDIM)] - aux * dMat[iPosicion(i,k,IDIM)];
dInv[iPosicion(j,k,IDIM)] = dInv[iPosicion(j,k,IDIM)] - aux * dInv[iPosicion(i,k,IDIM)];
}
}
}
}
dDur = omp_get_wtime() - dDur;
return dDur;
}
SECUENCIAL : PARALELO : SEC/PAR : HILO
0.000002,0.728881,0.000003,0.091110
0.000002,0.791984,0.000002,0.098998
0.000002,0.891514,0.000002,0.111439
0.000002,0.807865,0.000002,0.100983