Esempio n. 1
0
int main (int argc, char ** argv){
	unsigned int * V;
	double timetick;
	double limit = sqrt(CANTELEM)+1; //no puede haber divisores más grandes que limit 
	timetick = dwalltime();
	int i,j;
	if (NULL == (V = malloc(CANTELEM * sizeof(unsigned int)))){
		printf("No hay memoria suficiente :(\n");
		return -1;
	}
	for (i = 0; i < CANTELEM - 1; i++){V[i] = i;}
	printf("Inicialización = %f\n", dwalltime() - timetick);
	
	timetick = dwalltime();
	for (i = 2; i < limit; i++){
		for (j = 0; j < CANTELEM; j++){
			if (V[j] != 0){
				if ((V[j] % i) == 0){
					V[j] = 0;
				}
			}
		}
	}
	printf("Criba completa = %f\n", dwalltime() - timetick);
	for (i = 0; i < CANTELEM; i++){
		if (V[i] != 0){
			//printf("%u es primo\n", V[i]);
		}
	}
	return 0;
}
Esempio n. 2
0
int main(int argc,char*argv[]){
 double *A,*B,*C;
 int i,j,k;
 int check=1;
 double timetick;

 //Controla los argumentos al programa
 if ((argc != 2) || ((N = atoi(argv[1])) <= 0) )
  {
    printf("\nUsar: %s n\n  n: Dimension de la matriz (nxn X nxn)\n", argv[0]);
    exit(1);
  }

 //Aloca memoria para las matrices
  A=(double*)malloc(sizeof(double)*N*N);
  B=(double*)malloc(sizeof(double)*N*N);
  C=(double*)malloc(sizeof(double)*N*N);

 //Inicializa las matrices A y B en 1, el resultado sera una matriz con todos sus valores en N
  for(i=0;i<N;i++){
   for(j=0;j<N;j++){
	setValor(A,i,j,ORDENXFILAS,1);
	setValor(B,i,j,ORDENXFILAS,1);
   }
  }   


 //Realiza la multiplicacion

  timetick = dwalltime();

  for(i=0;i<N;i++){
   for(j=0;j<N;j++){
    setValor(C,i,j,ORDENXFILAS,0);
    for(k=0;k<N;k++){
	setValor(C,i,j,ORDENXFILAS, getValor(C,i,j,ORDENXFILAS) + getValor(A,i,k,ORDENXFILAS)*getValor(B,k,j,ORDENXFILAS));
    }
   }
  }   

 printf("Tiempo en segundos %f\n", dwalltime() - timetick);

 //Verifica el resultado
  for(i=0;i<N;i++){
   for(j=0;j<N;j++){
	check=check&&(getValor(C,i,j,ORDENXFILAS)==N);
   }
  }   

  if(check){
   printf("Multiplicacion de matrices resultado correcto\n");
  }else{
   printf("Multiplicacion de matrices resultado erroneo\n");
  }

 free(A);
 free(B);
 free(C);
 return(0);
}
Esempio n. 3
0
File: matmul.c Progetto: fivunlm/HPC
main(int argc, char *argv[])
{
  float *A, *B, *C;
  int n, i, j, k;
  double timetick;

  /* Chequeando parametros */
  if ((argc != 2) || ((n = atoi(argv[1])) <= 0) )
  {
    printf("Uso: %s n\n  donde n: dimension de la matriz cuadrada (nxn X nxn)\n", argv[0]);
    exit(1);
  }

  // Inicializando Matrices
  A = (float *) malloc(n*n*sizeof(float));
  B = (float *) malloc(n*n*sizeof(float));
  C = (float *) malloc(n*n*sizeof(float));
  initvalmat(A, n, 1.0); 
  initvalmat(B, n, 1.0); 
  initvalmat(C, n, 0.0); 


  printf("Multiplicando matrices de %d x %d \n", n, n);  
  timetick = dwalltime();
  
  /*************************************************************/
  /* Programar aqui el algoritmo de multiplicacion de matrices */
  /*************************************************************/
  
  for (i = 0; i < n; ++i)
  {
    for (j = 0; j < n; ++j)
    {
      for (k = 0; k < n; ++k)
      {
        C[i*n + j] += A[i*n + k] * B[k*n + j];  
      }
    }
  }
  
  /*************************************************************/
  
  timetick = dwalltime() - timetick;
  verify_result(C, n);

  printf("Resultado correcto. Tiempo de ejecucion: %f segundos\n", timetick);
}
Esempio n. 4
0
int main (int argc, char *argv[]){

 double *A; // Matriz A
 double *B; // Matriz B
 double *C; // Matriz C
 double timetick;


//El tamano de la matriz sera n= N*r , donde N y r se reciben
//por parametro se tendran N*N bloques de r*r cada uno

if (argc < 4){
  printf("\n Falta un parametro ");
  printf("\n 1. Cantidad de bloques por dimension ");
  printf("\n 2. Dimension de cada bloque ");
  printf("\n 3. 0/1 para imprimir/no imprimir resultados ");
  return 0;
}

 int N = atoi(argv[1]);
 int r = atoi(argv[2]);
 int imprimir=atoi(argv[3]);

 int n = N*r; //dimension de la matriz
 int sizeMatrix=n*n; //cantidad total de datos matriz
 int sizeBlock=r*r; //cantidad total de datos del bloque
 int i;

 A= (double *)malloc(sizeMatrix*sizeof(double)); //aloca memoria para A
 B= (double *)malloc(sizeMatrix*sizeof(double)); //aloca memoria para B
 C= (double *)malloc(sizeMatrix*sizeof(double)); //aloca memoria para C

 crearMatriz(A, sizeMatrix);			//Inicializa A 
 crearIdentidad(B,sizeBlock,sizeMatrix,N,r); //Inicializa B como matriz identidad

  timetick = dwalltime();
 producto(A,B,C,r,N,sizeMatrix,sizeBlock);
  printf("Tiempo en segundos %f \n", dwalltime() - timetick);

//tiempo
 if (imprimir ==1){
     printf("\n\n  A (como esta almacenada): \n" );
    imprimeVector(A, sizeMatrix);

     printf("\n\n  B (como esta almacenada): \n" );
    imprimeVector(B,sizeMatrix);

    printf("\n\n  A: \n" );
    imprimeMatriz(A,N,r);

    printf(" \n\n B: \n" );
    imprimeMatriz(B,N,r);

    printf("\n\n  C: \n" );
    imprimeMatriz(C,N,r);

 } 


 printf(" \n\n Realizando comprobacion ... \n" );
 for (i=0;i<sizeMatrix ;i++ )
 {
	 if (A[i]!=C[i])
	 {
       printf("\n Error %f", C[i] );
	 }
 }
//imprimir tiempo

 free(A);
 free(B);
 free(C);

 return 0;
} //FIN MAIN
Esempio n. 5
0
int main(int argc,char*argv[]){
 double *A,*B,*C,*D,*E;
 int i,j,k,N;
 int check=1;
 double timetick;

 //Controla los argumentos al programa
  if (argc < 3){
   printf("\n Faltan argumentos:: N dimension de la matriz, T cantidad de threads \n");
   return 0;
  }
 
   N=atoi(argv[1]);
   int numThreads = atoi(argv[2]);
   omp_set_num_threads(numThreads);

 //Aloca memoria para las matrices
  A=(double*)malloc(sizeof(double)*N*N);
  B=(double*)malloc(sizeof(double)*N*N);
  C=(double*)malloc(sizeof(double)*N*N);
  D=(double*)malloc(sizeof(double)*N*N);
  E=(double*)malloc(sizeof(double)*N*N);
 

 //Inicializa las matrices A, B,C en 1
  for(i=0;i<N;i++){
   for(j=0;j<N;j++){
	A[i*N+j]=1;
	B[i+j*N]=1;
	C[i*N+j]=1;
   }
  }   

  timetick = dwalltime();

 //Realiza la multiplicacion D= AxB
  for(i=0;i<N;i++){
   for(j=0;j<N;j++){
    D[i*N+j]=0;
    for(k=0;k<N;k++){
	D[i*N+j]= D[i*N+j] + A[i*N+k]*B[k+j*N];
    }
   }
  }   

   //Realiza la multiplicacion E= CxB
  for(i=0;i<N;i++){
   for(j=0;j<N;j++){
    E[i*N+j]=0;
    for(k=0;k<N;k++){
	E[i*N+j]= E[i*N+j] + C[i*N+k]*B[k+j*N];
    }
   }
  }   

  printf("Tiempo en segundos %f \n", dwalltime() - timetick);

 //Verifica el resultado
  for(i=0;i<N;i++){
   for(j=0;j<N;j++){
	check=check&&(D[i*N+j]==N)&&(E[i*N+j]==N);
   }
  }   

  if(check){
   printf("Multiplicacion de matrices resultado correcto\n");
  }else{
   printf("Multiplicacion de matrices resultado erroneo\n");
  }
 free(A);
 free(B);
 free(C);
 free(D);
 free(E);
 return(0);
}
Esempio n. 6
0
int main(int argc,char*argv[]){
 double *A,*B,*C ,*D,*ab,*cd, *tot;
 int i,j,k,N;
 int check=1;
 double timetick;

 //Controla los argumentos al programa
  if (argc < 2){
   printf("\n Falta un argumento:: N dimension de la matriz \n");
   return 0;
  }
 
   N=atoi(argv[1]);

 //Aloca memoria para las matrices
  A=(double*)malloc(sizeof(double)*N*N);
  B=(double*)malloc(sizeof(double)*N*N);
  C=(double*)malloc(sizeof(double)*N*N);
  D=(double*)malloc(sizeof(double)*N*N);
  ab=(double*)malloc(sizeof(double)*N*N);
  cd=(double*)malloc(sizeof(double)*N*N);
  tot=(double*)malloc(sizeof(double)*N*N);
  

 //Inicializa las matrices A y B en 1, el resultado sera una matriz con todos sus valores en N
  for(i=0;i<N;i++){
   for(j=0;j<N;j++){
	A[i*N+j]=1;
	B[i+j*N]=1;
	C[i*N+j]=1;
	D[i+j*N]=1;
	
   }
  }   

  timetick = dwalltime();
 //Realiza la multiplicacion
  for(i=0;i<N;i++){
   for(j=0;j<N;j++){
    ab[i*N+j]=0;
    for(k=0;k<N;k++){
	ab[i*N+j]= ab[i*N+j] + A[i*N+k]*B[k+j*N];
	cd[i*N+j]= cd[i*N+j] + C[i*N+k]*D[k+j*N];
	tot[i*N+j]= cd[i*N+j]+ ab[i*N+j];

    }
   }
  }   
   
  printf("Tiempo en segundos %f \n", dwalltime() - timetick);

 //Verifica el resultado
  for(i=0;i<N;i++){
   for(j=0;j<N;j++){
	check=check&&(tot[i*N+j]==N*2);
   }
  }   

  if(check){
   printf("Multiplicacion de matrices resultado correcto\n");
  }else{
   printf("Multiplicacion de matrices resultado erroneo\n");
  }

 free(A);
 free(B);
 free(C);
 free(D);
 free(ab);
 free(cd);
 free(tot);
 return(0);
}
Esempio n. 7
0
int main(int argc,char*argv[]) {


  omp_set_num_threads(numThreads);

 double *A,*B,*B2,*C,*D,*r1,*r2, *aux, *C2;
 int i,j,k;
 double timetick;
 int check=1;
 int param[numThreads];

 if ((argc != 2) || ((N = atoi(argv[1])) <= 0) )
  {
    printf("\nUsar: %s n\n  n: Dimension de la matriz (nxn X nxn)\n", argv[0]);
    exit(1);
  }

      //Aloca memoria para las matrices
	
    A=(double*)malloc(sizeof(double)*N*N);
    B=(double*)malloc(sizeof(double)*N*N);
    C=(double*)malloc(sizeof(double)*N*N);
    B2=(double*)malloc(sizeof(double)*N*N);
    D=(double*)malloc(sizeof(double)*N);
    r1=(double*)malloc(sizeof(double)*2);
    r2=(double*)malloc(sizeof(double)*2);

    /*
	A=(double*)malloc(sizeof(double)*9);
    B=(double*)malloc(sizeof(double)*9);
    C=(double*)malloc(sizeof(double)*9);
    B2=(double*)malloc(sizeof(double)*9);
    D=(double*)malloc(sizeof(double)*3);
	*/
	
	//Inicializa las matrices A y B en 1, el resultado sera una matriz con todos sus valores en N 
	// private(j) ?
	#pragma omp parallel for shared (A,B,D)
	for(i=0;i<N;i++){
	   for(j=0;j<N;j++){
		A[i*N+j]=1;
		B[i+j*N]=1;
	   }
	   D[i]=1;
	  }   


/*Inicializa matrices con los valores de prueba
	A[0]=1;
	A[1]=2;
	A[2]=6;
	A[3]=5;
	A[4]=9;
	A[5]=3;
	A[6]=4;
	A[7]=8;
	A[8]=7;
	
	B[0]=3;
	B[1]=3;
	B[2]=1;
	B[3]=2;
	B[4]=5;
	B[5]=7;
	B[6]=1;
	B[7]=3;
	B[8]=2;

	D[0]=4;
	D[1]=2;
	D[2]=3;
*/	
	
 //Punto A

  timetick = dwalltime();

    #pragma omp parallel for private(j,k) shared (A,B,B2,N)
	  for(i=0;i<N;i++){
	   for(j=0;j<N;j++){
		B2[i*N+j]=0;
		for(k=0;k<N;k++){
		 B2[i*N+j]=(B2[i*N+j] + A[i*N+k]*B[k+j*N]);
		}
	   }
	  }   

	#pragma omp parallel for private(j) shared (C,B2,D,N)
	  for(i=0;i<N;i++){
	   for(j=0;j<N;j++){
		C[i*N+j]=(B2[i*N+j]*D[j]);
	   }
	  }

  free(B2); 

 /*VERIFICACION
 	printf("\n");
 	printf("Matriz resultante del punto A:\n");
	printf(" %f",C[0]);printf("  %f",C[1]);printf("  %f\n",C[2]);
	printf(" %f",C[3]);printf("  %f",C[4]);printf("  %f\n",C[5]);
	printf(" %f",C[6]);printf("  %f",C[7]);printf("  %f\n",C[8]);
*/

 //Punto B

 double result;
 int l;

 getValues(A,r1);
 getValues(B,r2);
 result=((r1[0]*r1[0])/r1[1])*((r2[0]*r2[0])/r2[1]);

	#pragma omp parallel for shared(C)
	 for(l=0;l<(N*N);l++) {
	  C[l]=C[l]*result;
	 }

 /*VERIFICACION
 	printf("\n");
 	printf("Matriz resultante del punto B:\n");
	printf(" %f",C[0]);printf("  %f",C[1]);printf("  %f\n",C[2]);
	printf(" %f",C[3]);printf("  %f",C[4]);printf("  %f\n",C[5]);
	printf(" %f",C[6]);printf("  %f",C[7]);printf("  %f\n",C[8]);
*/
 
 
 free(r1);
 free(r2);

 //Punto C



 C2=(double*)malloc(sizeof(double)*N*N);
 column=(struct celda*)malloc((sizeof(double)+sizeof(double))*N);
 merge=(struct celda*)malloc((sizeof(double)+sizeof(double))*N);


 for(i=0;i<N;i++) {
  
	#pragma omp parallel for shared (valor,column)
	for(k=0;k<N;k++) {
		valor.pos=k;
		valor.value=C[i+N*k];
		column[k]=valor;
	}

	#pragma omp parallel for 
	for(k=0; k<numThreads; k++){
		//param[k]=k;
		sort( k );
	}

	#pragma omp parallel for 
  for(k=0; k<2; k++){
   initial_merge(k);
  }

	j=0;
	k=N/2;
	l=0;

	while(j<N/2 && k<N) {
		if (column[j].value<=column[k].value){
			merge[l]=column[j];
			j++;
		}else{
			merge[l]=column[k];
			k++;
			}
		l++;
	}
  while(j<N/2) {
   merge[l]=column[j];
   j++;
   l++;
  }
  while(k<N) {
   merge[l]=column[k];
   k++;
   l++;
  }

	#pragma omp parallel for private(k) shared (valor,N,i,C2,C)
  for(j=0;j<N;j++){
   valor=column[j];
   for(k=0;k<N-i;k++){
    C2[(j*N)+k]=C[((int)valor.pos*N)+i+k];
   }
  }  

	#pragma omp parallel for private(k) shared (N,i,C2,C)
  for(j=0;j<N;j++){
   for(k=0;k<N-i;k++){
    C[(j*N)+k+i]=C2[(j*N)+k];
   }
  }

 }
 free(C2);

 /*VERIFICACION
 	printf("\n");
 	printf("Matriz resultante del punto C:\n");
	printf(" %f",C[0]);printf("  %f",C[1]);printf("  %f\n",C[2]);
	printf(" %f",C[3]);printf("  %f",C[4]);printf("  %f\n",C[5]);
	printf(" %f",C[6]);printf("  %f",C[7]);printf("  %f\n",C[8]);
*/
	
 printf("Tiempo en segundos %f\n", dwalltime() - timetick);

 free(A);
 free(B);
 free(C);
 free(D);

 return 0;
}
Esempio n. 8
0
int main(int argc,char*argv[]){
 double *A,*B,*C;
 int i,j,k,N;
 int check=1;
 double timetick;

 //Controla los argumentos al programa
  if (argc < 3){
   printf("\n Faltan argumentos:: N dimension de la matriz, T cantidad de threads \n");
   return 0;
  }
  N=atoi(argv[1]);
  int numThreads=atoi(argv[2]);
  omp_set_num_threads(numThreads);
 
   
 //Aloca memoria para las matrices
  A=(double*)malloc(sizeof(double)*N*N);
  B=(double*)malloc(sizeof(double)*N*N);
  C=(double*)malloc(sizeof(double)*N*N);

 //Inicializa las matrices A y B en 1, el resultado sera una matriz con todos sus valores en N
  for(i=0;i<N;i++){
   for(j=0;j<N;j++){
	A[i*N+j]=1;
	B[i+j*N]=1;
   }
  }   

  timetick = dwalltime();
 //Realiza la multiplicacion
int tmp;
#pragma omp parallel for default(shared) private(i,j,tmp)
    for(i=0;i<N;i++){
        for(j=0;j<N;j++){
            tmp=0;
            for(k=0;k<N;k++){
         	tmp += A[i*N+k]*B[k+j*N];
            } 
            C[i*N+j]=tmp;
         }
     }
  printf("Tiempo en segundos %f \n", dwalltime() - timetick);

 //Verifica el resultado
  for(i=0;i<N;i++){
   for(j=0;j<N;j++){
	check=check&&(C[i*N+j]==N);
   }
  }   

  if(check){
   printf("Multiplicacion de matrices resultado correcto\n");
  }else{
   printf("Multiplicacion de matrices resultado erroneo\n");
  }

 free(A);
 free(B);
 free(C);
 return(0);
}
int main(int argc,char*argv[]){
 int i,in,j,k;
 int check=1;
 double timetick;

 //Controla los argumentos al programa
 if ((argc != 2) || ((N = atoi(argv[1])) <= 0) )
  {
    printf("\nUsar: %s n\n  n: Dimension de la matriz (nxn X nxn)\n", argv[0]);
    exit(1);
  }

 //Aloca memoria para las matrices
  A=(double*)malloc(sizeof(double)*N*N);
  B=(double*)malloc(sizeof(double)*N*N);
  C=(double*)malloc(sizeof(double)*N*N);
  
  for(i=0;i<N;i++){
      in=i*N;
   for(j=0;j<N;j++){
	A[in+j] = 1;
	B[in+j] = 1;
   }
  }   

  // Defino los thread
  pthread_t thread[N_THREADS];
  struct thread_data data[N_THREADS];
  
  pthread_attr_t attr;
  int rc;
  jobs_thread=N/N_THREADS;
  pthread_attr_init(&attr);
  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

  timetick = dwalltime();

  for(i=0; i<N_THREADS; i++)
      {
	  data[i].tid=i;
	  rc = pthread_create(&thread[i], &attr, t_average, (void *) &data[i]);
	  if (rc){
	      printf("ERROR; return code from pthread_create() is %d\n", rc);
	      exit(-1);
	  }
}
  double a,b = 0;
  for(i=0; i<N_THREADS; i++)
      {
	  pthread_join(thread[i], NULL);
	  a += data[i].result_a;
	  b += data[i].result_b;
      }

  average = (a/(N*N))*(b/(N*N));
  
  for(i=0; i<N_THREADS; i++)
      {
	  rc = pthread_create(&thread[i], &attr, prod_matrix, (void *)&data[i]);
	  if (rc){
	      printf("ERROR; return code from pthread_create() is %d\n", rc);
	      exit(-1);
	  }
      }
  
  for(i=0; i<N_THREADS; i++)
      {
	  pthread_join(thread[i], NULL);
      }
    

  //printf("Tiempo en segundos %f\n", dwalltime() - timetick);

 //Verifica el resultado
  for(i=0;i<N;i++){
      in=i*N;
   for(j=0;j<N;j++){
	//check=check&&(getValor(C,i,j,ORDENXFILAS)==N);
	check=check&&(C[in+j]==N);
   }
  }   

  if(check){
      printf("%f\n",dwalltime() - timetick);
	//   printf("Multiplicacion de matrices resultado correcto\n");
  }else{
   printf("Multiplicacion de matrices resultado erroneo\n");
  }

 free(A);
 free(B);
 free(C);
 pthread_exit(NULL);
 return(0);
}
int main(int argc,char*argv[]) {
    double *A;
    double temp;
    int i,j, N;
    int check=1;
    double timetick;

//Controla los argumentos al programa
    if (argc < 2) {
        printf("\n Faltan argumentos:: N dimension de la matriz \n");
        return 0;
    }
    N=atoi(argv[1]);

//Aloca memoria para las matrices
    A=(double*)malloc(sizeof(double)*N*N);

    //Inicializa la matriz con unos en el triangulo inferior y ceros en el triangulo superior.
    for(i=0; i<N; i++) {
        for(j=0; j<N; j++) {
            if (i>=j)
            {
                A[i*N+j]= 1.0;
            }
            else
            {
                A[i*N+j]= 0.0;
            }

        }
    }

    timetick = dwalltime();
    for(i=0; i<N; i++) {
        for(j=i+1; j<N; j++) {
            temp = A[i*N+j];
            A[i*N+j]= A[j*N+i];
            A[j*N+i]= temp;

        }
    }
    printf("Tiempo en segundos: %f \n", dwalltime() - timetick);

    //Chequea los resultados
    for(i=0; i<N; i++) {
        for(j=0; j<N; j++) {
            if (i>j)
            {
                check= check&&(A[i*N+j]==0.0);
            }
            else
            {
                check= check&&(A[i*N+j]== 1.0);
            }

        }
    }

    if(check) {
        printf("Resultado correcto\n");
    } else {
        printf("Resultado erroneo\n");
    }
    free(A);
    return(0);
}