Advertisement
Guest User

Untitled

a guest
May 26th, 2019
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.99 KB | None | 0 0
  1. /*
  2.     Marly da Cruz Cláudio 8936885
  3.     Danilo Marques Araujo dos Santos 8598670
  4.  
  5.     Particionamento: por dados, onde cada elemento da matriz é processado em paralelo
  6.     Comunicação: o cálculo da nova matriz depende da leitura da matriz e do seu limiar,
  7.     e a exibição da matriz depende do cálculo estar pronto
  8.     Aglomeração: cada bloco é responsável por checar o limiar de um elemento da matriz
  9.     Mapeamento: cada bloco (1 dimensão = x) possui uma thread executando
  10. */
  11.  
  12. #include <stdlib.h>
  13. #include <stdio.h>
  14.  
  15. __global__ void filter(int *matriz, int *matriz_limiar, int N, int limiar) {
  16.     int tid = blockIdx.x;
  17.  
  18.     if(tid < N) {
  19.         if(matriz[tid] <= limiar)
  20.             matriz_limiar[tid] = 0;
  21.         else
  22.             matriz_limiar[tid] = 1;
  23.     }
  24. }
  25.  
  26. int main(int argc,char **argv) {
  27.  
  28.     int lin, col, i, j, limiar, *matriz, *matriz_limiar, elementos;
  29.     int *dev_matriz, *dev_matriz_limiar;
  30.  
  31.     fscanf(stdin, "%d ", &lin);
  32.     fscanf(stdin, "%d\n", &col);
  33.     fscanf(stdin, "%d\n", &limiar);
  34.  
  35.     elementos = lin * col;
  36.  
  37.     matriz=(int *)malloc(elementos * sizeof(int));
  38.     matriz_limiar=(int *)malloc(elementos * sizeof(int));
  39.  
  40.     cudaMalloc((void**)&dev_matriz, elementos * sizeof(int));
  41.     cudaMalloc((void**)&dev_matriz_limiar, elementos * sizeof(int));
  42.  
  43.     for(i = 0; i < lin; i++) {
  44.         for(j = 0; j < col; j++) {
  45.             fscanf(stdin, "%d ", &(matriz[i*col+j]));
  46.         }
  47.     }
  48.  
  49.     cudaMemcpy(dev_matriz, matriz, elementos * sizeof(int),cudaMemcpyHostToDevice);
  50.  
  51.     filter<<<elementos,1>>>(dev_matriz, dev_matriz_limiar, elementos, limiar);
  52.  
  53.     cudaMemcpy(matriz_limiar, dev_matriz_limiar, elementos * sizeof(int),cudaMemcpyDeviceToHost);
  54.  
  55.     for(i = 0; i < lin; i++) {
  56.         for(j = 0; j < col; j++) {
  57.             printf("%d ", matriz_limiar[i*col+j]);
  58.         }
  59.         printf("\n");
  60.     }
  61.  
  62.     cudaFree(matriz);
  63.     cudaFree(matriz_limiar);
  64.  
  65.     free(matriz);
  66.     free(matriz_limiar);
  67.  
  68.     return 0;
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement