Advertisement
ithoran

PSLab5Test

Jun 7th, 2018
318
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.42 KB | None | 0 0
  1. #include <stdio.h>
  2. #define SIZE 100
  3. #define BLOCKSIZE 100
  4.  
  5.  
  6. void HANDLE_ERROR(cudaError_t call)
  7. {
  8.     cudaError_t ret = call;
  9.     switch (ret)
  10.     {
  11.     case cudaSuccess:
  12.         break;
  13.     case cudaErrorInvalidValue:
  14.         printf("ERROR: InvalidValue:%i.\n", __LINE__);
  15.         exit(-1);
  16.         break;
  17.     case cudaErrorInvalidMemcpyDirection:
  18.         printf("ERROR:Invalid memcpy direction:%i.\n", __LINE__);
  19.         exit(-1);
  20.         break;
  21.     default:
  22.         printf("ERROR>line:%i.%d' ‘ %s\n", __LINE__, ret, cudaGetErrorString(ret));
  23.         exit(-1);
  24.         break;
  25.     }
  26. }
  27.  
  28. __device__ int pomnozi(int a, int b)
  29. {
  30.     return a*b;
  31. }
  32.  
  33. __global__ void compute(int** d_a, int* d_b, int* d_c)
  34. {
  35.     d_c[threadIdx.x] = 0;
  36.     for (int i = 0; i<SIZE; i++) {
  37.         int ela = d_a[threadIdx.x][i];
  38.         int elb = d_b[i];
  39.         d_c[threadIdx.x] += pomnozi(ela, elb);
  40.     }
  41. }
  42.  
  43. __host__ void outer_compute(int** h_a, int* h_b, int* h_c)
  44. {
  45.     int *d_a, *d_b, *d_c, i;
  46.     HANDLE_ERROR(cudaMalloc((void **)& d_a, SIZE * sizeof(int)));
  47.     for (i = 0; i < SIZE; ++i)
  48.         HANDLE_ERROR(cudaMalloc((void **)& d_a[i], SIZE * sizeof(int)));
  49.     HANDLE_ERROR(cudaMalloc((void **)& d_b, SIZE * sizeof(int)));
  50.     HANDLE_ERROR(cudaMalloc((void **)& d_c, BLOCKSIZE * sizeof(int)));
  51.  
  52.     //kopiranje nizova iz CPU u GPU
  53.     HANDLE_ERROR(cudaMemcpy(d_a, h_a, SIZE * sizeof(int), cudaMemcpyHostToDevice));
  54.     HANDLE_ERROR(cudaMemcpy(d_b, h_b, SIZE * sizeof(int), cudaMemcpyHostToDevice));
  55.  
  56.     compute << <1, BLOCKSIZE >> > (d_a, d_b, d_c);
  57.  
  58.     //sinhronizovanje i kopiranje niza iz GPU u CPU
  59.     cudaThreadSynchronize();
  60.     HANDLE_ERROR(cudaMemcpy(h_c, d_c, BLOCKSIZE * sizeof(int), cudaMemcpyDeviceToHost));
  61.  
  62.     cudaFree(d_a);
  63.     cudaFree(d_b);
  64.     cudaFree(d_c);
  65. }
  66.  
  67.  
  68. int main(int argc, char **argv)
  69. {
  70.     int i, j;
  71.     int a[SIZE][SIZE], b[SIZE], c_array[BLOCKSIZE];
  72.     int sumCuda = 0, sumClassic=0;
  73.    
  74.     //inicijalizacija
  75.     for (i = 0; i < SIZE; ++i) {
  76.         b[i] = i;
  77.         for (j = 0; j < SIZE; ++j) {
  78.             a[i][j] = i * SIZE + j;
  79.         }
  80.     }
  81.    
  82.     //pozivanje host funkcije za CUDA i
  83.     outer_compute(a, b, c_array);
  84.     //Sabiranje rezultata dobijenih iz niti
  85.     for (i = 0; i < SIZE; i++) {
  86.         printf("Rezultat paralelni %d \n", c_array[i]);
  87.         c_array[i] = 0;
  88.     }
  89.    
  90.    
  91.     //sekvencijalan kod
  92.     for (i = 0; i<SIZE; i++) {
  93.         for (j = 0; j < SIZE; ++j)
  94.             c_array[i] += a[i][j] * b[j];
  95.     }
  96.  
  97.  
  98.     for (i = 0; i < SIZE; i++) {
  99.         printf("Rezultat sekvencijalni %d \n", c_array[i]);
  100.         c_array[i] = 0;
  101.     }
  102.    
  103.     //printf("Razlika izmedju dva rezultata je %d",sumClassic-sumCuda);
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement