online compiler and debugger for c/c++

code. compile. run. debug. share.
Source Code   
Language
#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

Compiling Program...

Command line arguments:
Standard Input: Interactive Console Text
×

                

                

Program is not being debugged. Click "Debug" button to start program in debug mode.

#FunctionFile:Line
VariableValue
RegisterValue
ExpressionValue