SHARE
TWEET

Untitled

a guest Jun 15th, 2019 67 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <pthread.h>
  3. #include <time.h>
  4. #include <unistd.h>
  5. #include <stdlib.h>
  6. #include <sys/time.h>
  7. /* Time in seconds from some point in the past */
  8.  
  9. /*****************************************************************/
  10.  
  11. double dwalltime()
  12. {
  13.     double sec;
  14.     struct timeval tv;
  15.  
  16.     gettimeofday(&tv, NULL);
  17.     sec = tv.tv_sec + tv.tv_usec / 1000000.0;
  18.     return sec;
  19. }
  20.  
  21. //FIN de calcular tiempo
  22.  
  23. int N = 4;
  24. /*Variables pertenecientes a los hilos*/
  25. int P = 0;
  26. pthread_mutex_t s = PTHREAD_MUTEX_INITIALIZER;
  27. /*Variables a reemplazar por argumentos*/
  28. int Min = 999;
  29. int Max = -1;
  30. int check = 1;
  31.  
  32. /*matriz A por fila y por columnas*/
  33. int *A,*RESULT;
  34. double timetick;
  35. //funcion para poder visualizar matriz
  36. void vermatriz(int *m, int modo)
  37. {
  38.     /*LE DA EL FORMATO A LA COLUMNA*/
  39.     printf(" \t Columna |\t");
  40.     for (int k = 0; k < N; k++)
  41.     {
  42.         printf(" %d \t", k);
  43.     }
  44.     printf("\n");
  45.     printf("\t -------------------------------------------");
  46.     printf("\n");
  47.  
  48.     printf("\t");
  49.     for (int i = 0; i < N; i++)
  50.     {
  51.         printf(" Fila %d  |\t", i);
  52.         for (int j = 0; j < N; j++)
  53.         {
  54.             if (modo == 0)
  55.             {
  56.                 printf(" %d \t", m[i * N + j]); //recorre por fila
  57.             }
  58.             else
  59.             {
  60.                 printf(" %d \t", m[i + j * N]); //recorre por columna
  61.             }
  62.         }
  63.         printf("\n \t");
  64.     }
  65. }
  66.  
  67. void *Funcion_maxmin(void *arg)
  68. {
  69.  
  70.     int tid = *(int *)arg;
  71.     int ini = tid * (P);
  72.     int fin = (tid + 1) * (P);
  73.     int min = 999;
  74.     int max = -1; // es mejor calcular los minimos y maximos de manera local
  75.     // y al final pasarselos a una variable global minimo y maximo. Esto es debido a la rapidez
  76.     printf(" \n ");
  77.     printf(" ESTOY EN LA FUNCION DE H %d", tid);
  78.     printf(" \n ");
  79.     printf(" INI %d FIN  %d", ini, fin);
  80.     printf(" \n ");
  81.  
  82.     for (int i = ini; i < fin; i++)
  83.     {
  84.         for (int j = ini; j < fin; j++)
  85.         {
  86.             if (A[i * fin + j] < min)
  87.                 min = A[i * N + j];
  88.             if (A[i * fin + j] > max)
  89.                 max = A[i * N + j];
  90.         }
  91.     }
  92.     // se lo pasamos a la variable global
  93.  
  94.     pthread_mutex_lock(&s);
  95.     if (min < Min)
  96.         Min = min;
  97.     pthread_mutex_unlock(&s);
  98.  
  99.     pthread_mutex_lock(&s);
  100.     if (max > Max)
  101.         Max = max;
  102.  
  103.     pthread_mutex_unlock(&s);
  104.     pthread_exit(NULL); //finalizacion del hilo
  105. }
  106.  
  107. int main(int argc, char *argv[])
  108. {
  109.     int H = 2; // es un valor por defecto en el caso de que no se
  110.     // introduzca ningun valor por consola.
  111.  
  112.     //Controla los argumentos al programa
  113.     if ((argc != 3) || ((N = atoi(argv[1])) <= 0) || ((H = atoi(argv[2])) <= 0))
  114.     {
  115.         printf("\nUsar: %s n\n  h: cant hilos  \n", argv[0]);
  116.         exit(1);
  117.     }
  118.  
  119.     /*Declarar e inicializaciones*/
  120.     N = atoi(argv[1]); // Inicializa valor de mi arreglo de N elementos
  121.     H = atoi(argv[2]); //incializar valor de hilos
  122.  
  123.     //calculamos la proporcion
  124.     P = N / H;
  125.  
  126.     /*Matriz A original*/
  127.     A = (int *)malloc(N * N * sizeof(int));
  128.  
  129.     RESULT = (int *)malloc(N * N * sizeof(int));
  130.  
  131.     for (int i = 0; i < N; i++)
  132.     {
  133.         for (int j = 0; j < N; j++)
  134.         {
  135.             A[i * N + j] = i;
  136.         }
  137.     }
  138.     vermatriz(A, 0);
  139.     //Reservo memoria para el vector de hilos
  140.     pthread_t *tid = (pthread_t *)(malloc(sizeof(pthread_t) * H)); // por esto me daba error!
  141.     int *threads_ids = (int *)(malloc(sizeof(int) * H));
  142.     pthread_mutex_init(&s, NULL); // inicializacion s
  143.  
  144.     //Realiza el tiempo inicial para la busqueda y calclulo
  145.     timetick = dwalltime();
  146.     for (int t = 0; t < H; t++)
  147.     {
  148.         threads_ids[t] = t;
  149.         pthread_create(&tid[t], NULL, Funcion_maxmin, (void *)&threads_ids[t]);
  150.     }
  151.     for (int t = 0; t < H; t++)
  152.         pthread_join(tid[t], NULL);
  153.     //Destruccion de s
  154.     pthread_mutex_destroy(&s);
  155.  
  156.  
  157.     //Realiza el tiempo iniial para la busqueda y calclulo
  158.     timetick = dwalltime();
  159.     printf("Tiempo en segundos %f\n", dwalltime() - timetick);
  160.  
  161.     if (check)
  162.         printf("Multiplicacion de matrices resultado correcto\n");
  163.     else
  164.         printf("Multiplicacion de matrices resultado erroneo\n");
  165.  
  166.     printf("resultado max es: %d \n", Max);
  167.     printf("resultado min es: %d \n", Min);
  168.  
  169.     /*Matriz A original*/
  170.     free(A);
  171.     free(RESULT);
  172.  
  173.     return (0);
  174. }
  175.  
  176. //NOTA AVERIGUAR POR QUE SE DESBORDA
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top