Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define SRAND_VALUE 1985
- #define dim 2048
- #define ger 2000
- #define QTD 1
- #include <stdio.h>
- #include <stdlib.h>
- #include <omp.h>
- #include <time.h>
- #include <sys/time.h>
- int vizinhos(int **matriz, int i, int j){
- int soma = 0;
- 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];
- if (matriz[i][j] == 1){
- if (soma < 2){
- return 0;
- }
- if (soma == 2 || soma == 3){
- return 1;
- }
- if (soma > 3){
- return 0;
- }
- }else{
- if (soma == 3){
- return 1;
- }else{
- return 0;
- }
- }
- return 0;
- }
- int conta_vivos(int **matriz){ ///OK
- int sum = 0, i, j;
- for (i = 1; i < dim + 1; i++){
- for (j = 1; j < dim + 1; j++){
- sum += matriz[i][j];
- }
- }
- return sum;
- }
- void copiaborda(int **matriz){///OK
- int i, j, k;
- for (i = 1; i < dim + 1; i++){ ///CIMA
- matriz[0][i] = matriz[dim][i];
- }
- for (i = 1; i < dim + 1; i++){ ///BAIXO
- matriz[dim + 1][i] = matriz[1][i];
- }
- for (i = 1; i < dim + 1; i++){ ///DIREITA
- matriz[i][dim + 1] = matriz[i][1];
- }
- for (i = 1; i < dim + 1; i++){ ///ESQUERDA
- matriz[i][0] = matriz[i][dim];
- }
- matriz[0][0] = matriz[dim][dim];
- matriz[0][dim + 1] = matriz[dim][1];
- matriz[dim + 1][0] = matriz[1][dim];
- matriz[dim + 1][dim + 1] = matriz[1][1];
- return;
- }
- void desalocamatriz(int **matriz){ ///OK
- int i, j;
- for (i = 0; i < dim + 2; i++){
- free(matriz[i]);
- }
- free(matriz);
- return;
- }
- int **alocamatriz(){ ///OK
- int i, j;
- int **matriz = (int **)calloc(dim + 2, sizeof(int *));
- for (i = 0; i < dim + 2; i++){
- matriz[i] = (int *)calloc(dim + 2, sizeof(int)); //Aloca um Vetor de Inteiros para cada posição do Vetor de Ponteiros.
- }
- return (matriz);
- }
- int main(){
- int i, j, k, DeltaT;
- int **matriz = alocamatriz();
- int **matriz_nova;
- int **aux;
- struct timeval start, end;
- ///GERANDO A MATRIZ ALEATÓRIA
- srand(SRAND_VALUE);
- for (i = 1; i < dim + 1; i++){
- for (j = 1; j < dim + 1; j++){
- matriz[i][j] = rand() % 2;
- }
- }
- matriz_nova = alocamatriz();
- printf("Geracao 0: %d \n", conta_vivos(matriz));
- gettimeofday(&start, NULL);
- for (k = 0; k < ger; k++){
- copiaborda(matriz);
- #pragma omp parallel private(i, j) num_threads(QTD)
- #pragma omp for
- for (i = 1; i < dim + 1; i++){
- for (j = 1; j < dim + 1; j++){
- matriz_nova[i][j] = vizinhos(matriz, i, j);
- }
- }
- aux = matriz;
- matriz = matriz_nova;
- matriz_nova = aux;
- }
- gettimeofday(&end, NULL); ///SALVAR O TEMPO ATUAL DEPOIS DAS THREADS
- DeltaT = (int)(1000 * (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec) / 1000);
- printf("Geracao %d: %d \n", k, conta_vivos(matriz));
- printf("Tempo gasto com %d threads: %d ms\n", QTD, DeltaT);
- desalocamatriz(matriz);
- desalocamatriz(matriz_nova);
- return (0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement