Advertisement
Guest User

Untitled

a guest
Aug 25th, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.25 KB | None | 0 0
  1. #define SRAND_VALUE 1985
  2. #define dim 2048
  3. #define ger 2000
  4. #define QTD 1
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <omp.h>
  8. #include <time.h>
  9. #include <sys/time.h>
  10.  
  11. int vizinhos(int **matriz, int i, int j){
  12.     int soma = 0;
  13.  
  14.     soma = matriz[i - 1][j - 1] + matriz[i][j - 1] + matriz[i + 1][j - 1] + matriz[i - 1][j] + matriz[i + 1][j] + matriz[i - 1][j + 1] + matriz[i][j + 1] + matriz[i + 1][j + 1];
  15.     if (matriz[i][j] == 1){
  16.         if (soma < 2){
  17.             return 0;
  18.         }
  19.         if (soma == 2 || soma == 3){
  20.             return 1;
  21.         }
  22.         if (soma > 3){
  23.             return 0;
  24.         }
  25.     }else{
  26.         if (soma == 3){
  27.             return 1;
  28.         }else{
  29.             return 0;
  30.         }
  31.     }
  32.     return 0;
  33. }
  34.  
  35. int conta_vivos(int **matriz){ ///OK
  36.     int sum = 0, i, j;
  37.     for (i = 1; i < dim + 1; i++){
  38.         for (j = 1; j < dim + 1; j++){
  39.             sum += matriz[i][j];
  40.         }
  41.     }
  42.     return sum;
  43. }
  44.  
  45. void copiaborda(int **matriz){///OK
  46.     int i, j, k;
  47.  
  48.     for (i = 1; i < dim + 1; i++){ ///CIMA
  49.         matriz[0][i] = matriz[dim][i];
  50.     }
  51.     for (i = 1; i < dim + 1; i++){ ///BAIXO
  52.         matriz[dim + 1][i] = matriz[1][i];
  53.     }
  54.     for (i = 1; i < dim + 1; i++){ ///DIREITA
  55.         matriz[i][dim + 1] = matriz[i][1];
  56.     }
  57.     for (i = 1; i < dim + 1; i++){ ///ESQUERDA
  58.         matriz[i][0] = matriz[i][dim];
  59.     }
  60.  
  61.     matriz[0][0] = matriz[dim][dim];
  62.     matriz[0][dim + 1] = matriz[dim][1];
  63.     matriz[dim + 1][0] = matriz[1][dim];
  64.     matriz[dim + 1][dim + 1] = matriz[1][1];
  65.  
  66.     return;
  67. }
  68.  
  69. void desalocamatriz(int **matriz){ ///OK
  70.     int i, j;
  71.     for (i = 0; i < dim + 2; i++){
  72.         free(matriz[i]);
  73.     }
  74.  
  75.     free(matriz);
  76.     return;
  77. }
  78.  
  79. int **alocamatriz(){ ///OK
  80.     int i, j;
  81.     int **matriz = (int **)calloc(dim + 2, sizeof(int *));
  82.     for (i = 0; i < dim + 2; i++){
  83.         matriz[i] = (int *)calloc(dim + 2, sizeof(int)); //Aloca um Vetor de Inteiros para cada posição do Vetor de Ponteiros.
  84.     }
  85.  
  86.     return (matriz);
  87. }
  88.  
  89. int main(){
  90.     int i, j, k, DeltaT;
  91.     int **matriz = alocamatriz();
  92.     int **matriz_nova;
  93.     int **aux;
  94.  
  95.     struct timeval start, end;
  96.  
  97.     ///GERANDO A MATRIZ ALEATÓRIA
  98.     srand(SRAND_VALUE);
  99.     for (i = 1; i < dim + 1; i++){
  100.         for (j = 1; j < dim + 1; j++){
  101.             matriz[i][j] = rand() % 2;
  102.         }
  103.     }
  104.     matriz_nova = alocamatriz();
  105.  
  106.     printf("Geracao 0: %d \n", conta_vivos(matriz));
  107.     gettimeofday(&start, NULL);
  108.  
  109.     for (k = 0; k < ger; k++){
  110.         copiaborda(matriz);
  111.  
  112. #pragma omp parallel private(i, j) num_threads(QTD)
  113. #pragma omp for
  114.         for (i = 1; i < dim + 1; i++){
  115.             for (j = 1; j < dim + 1; j++){
  116.                 matriz_nova[i][j] = vizinhos(matriz, i, j);
  117.             }
  118.         }
  119.         aux = matriz;
  120.         matriz = matriz_nova;
  121.         matriz_nova = aux;
  122.     }
  123.  
  124.     gettimeofday(&end, NULL); ///SALVAR O TEMPO ATUAL DEPOIS DAS THREADS
  125.  
  126.     DeltaT = (int)(1000 * (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec) / 1000);
  127.     printf("Geracao %d: %d \n", k, conta_vivos(matriz));
  128.     printf("Tempo gasto com %d threads: %d ms\n", QTD, DeltaT);
  129.  
  130.     desalocamatriz(matriz);
  131.     desalocamatriz(matriz_nova);
  132.  
  133.     return (0);
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement