Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2019
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.98 KB | None | 0 0
  1. /* SumaVectoresC.c
  2.  Suma de dos vectores: v3 = v1 + v2
  3.  
  4.  Para compilar usar (-lrt: real time library, es posible que no sea necesario usar -lrt):  
  5.   gcc  -O2  SumaVectores.c -o SumaVectores -lrt
  6.   gcc  -O2 -S SumaVectores.c -lrt
  7.  Para ejecutar use: SumaVectoresC longitud
  8.    
  9. */
  10.  
  11. #include <stdlib.h> // biblioteca con funciones atoi(), malloc() y free()
  12. #include <stdio.h>  // biblioteca donde se encuentra la función printf()
  13. #include <time.h> // biblioteca donde se encuentra la función clock_gettime()
  14. #include <omp.h>
  15.  
  16. //Sólo puede estar definida una de las tres constantes VECTOR_ (sólo uno de los ...
  17. //tres defines siguientes puede estar descomentado):
  18. //#define VECTOR_LOCAL  // descomentar para que los vectores sean variables ...
  19.       // locales (si se supera el tamaño de la pila se ...
  20.       // generará el error "Violación de Segmento")
  21. //#define VECTOR_GLOBAL // descomentar para que los vectores sean variables ...
  22.       // globales (su longitud no estará limitada por el ...
  23.       // tamaño de la pila del programa)
  24. #define VECTOR_DYNAMIC  // descomentar para que los vectores sean variables ...
  25.       // dinámicas (memoria reutilizable durante la ejecución)
  26.  
  27. #ifdef VECTOR_GLOBAL
  28. #define MAX 33554432  //=2^25
  29.    
  30. double v1[MAX], v2[MAX], v3[MAX];
  31. #endif
  32. int main(int argc, char** argv){
  33.  
  34.   int i;
  35.  
  36.   double cgt1, ncgt;
  37.  
  38.   //Leer argumento de entrada (nº de componentes del vector)
  39.   if (argc<2){  
  40.     printf("Faltan nº componentes del vector\n");
  41.     exit(-1);
  42.   }
  43.  
  44.   unsigned int N = atoi(argv[1]); // Máximo N =2^32-1=4294967295 (sizeof(unsigned int) = 4 B)
  45.   printf("Tamaño Vectores:%u (%u B)\n",N, sizeof(unsigned int));
  46.   #ifdef VECTOR_LOCAL
  47.   double v1[N], v2[N], v3[N];   // Tamaño variable local en tiempo de ejecución ...
  48.         // disponible en C a partir de C99
  49.   #endif
  50.   #ifdef VECTOR_GLOBAL
  51.   if (N>MAX) N=MAX;
  52.   #endif
  53.   #ifdef VECTOR_DYNAMIC
  54.   double *v1, *v2, *v3;
  55.   v1 = (double*) malloc(N*sizeof(double));// malloc necesita el tamaño en bytes
  56.   v2 = (double*) malloc(N*sizeof(double));
  57.   v3 = (double*) malloc(N*sizeof(double));
  58.   if ((v1 == NULL) || (v2 == NULL) || (v2 == NULL)) {
  59.     printf("No hay suficiente espacio para los vectores \n");
  60.     exit(-2);
  61.   }
  62.   #endif
  63.  
  64.   //Inicializar vectores
  65.   #pragma omp parallel sections private(i)
  66.   {
  67.     #pragma omp section
  68.       for(i=0; i<N/4; i++){
  69.         v1[i] = N*0.1+i*0.1; v2[i] = N*0.1-i*0.1;
  70.       }
  71.  
  72.     #pragma omp section
  73.       for(i=N/4; i<N/2; i++){
  74.         v1[i] = N*0.1+i*0.1; v2[i] = N*0.1-i*0.1;
  75.       }
  76.  
  77.     #pragma omp section
  78.       for(i=N/2; i<3*N/4; i++){
  79.         v1[i] = N*0.1+i*0.1; v2[i] = N*0.1-i*0.1;
  80.       }
  81.  
  82.     #pragma omp section
  83.       for(i=3*N/4; i<N; i++){
  84.         v1[i] = N*0.1+i*0.1; v2[i] = N*0.1-i*0.1;
  85.       }
  86.   }
  87.  
  88.   cgt1 = omp_get_wtime();
  89.   //Calcular suma de vectores
  90.   #pragma omp parallel sections private(i)
  91.   {
  92.     #pragma omp section
  93.       for(i=0; i<N/4; i++)
  94.         v3[i] = v1[i] + v2[i];
  95.  
  96.     #pragma omp section
  97.       for(i=N/4; i<N/2; i++)
  98.         v3[i] = v1[i] + v2[i];
  99.  
  100.     #pragma omp section
  101.       for(i=N/2; i<3*N/4; i++)
  102.         v3[i] = v1[i] + v2[i];
  103.  
  104.     #pragma omp section
  105.       for(i=3*N/4; i<N; i++)
  106.         v3[i] = v1[i] + v2[i];
  107.   }
  108.  
  109.   ncgt = omp_get_wtime() - cgt1;
  110.  
  111.   //Imprimir resultado de la suma y el tiempo de ejecución
  112.   if (N<10) {
  113.   printf("Tiempo:%11.9f\t / Tamaño Vectores:%u\n",ncgt,N);
  114.   for(i=0; i<N; i++)
  115.     printf("/ V1[%d]+V2[%d]=V3[%d](%8.6f+%8.6f=%8.6f) /\n",
  116.            i,i,i,v1[i],v2[i],v3[i]);
  117.   }
  118.   else
  119.     printf("Tiempo:%11.9f\t / Tamaño Vectores:%u\t/ V1[0]+V2[0]=V3[0](%8.6f+%8.6f=%8.6f) / / V1[%d]+V2[%d]=V3[%d](%8.6f+%8.6f=%8.6f) /\n",
  120.            ncgt,N,v1[0],v2[0],v3[0],N-1,N-1,N-1,v1[N-1],v2[N-1],v3[N-1]);
  121.  
  122.  
  123.   #ifdef VECTOR_DYNAMIC
  124.   free(v1); // libera el espacio reservado para v1
  125.   free(v2); // libera el espacio reservado para v2
  126.   free(v3); // libera el espacio reservado para v3
  127.   #endif
  128.   return 0;
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement