Advertisement
bokunda

Untitled

May 20th, 2021
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.96 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <cuda_runtime.h>
  4. #include <curand.h>
  5. #include <curand_kernel.h>
  6.  
  7. #define K 6
  8. #define THREADS_PER_BLOCK 256
  9.  
  10. int* allocateArray(int n)
  11. {
  12. return (int*)malloc(n * sizeof(int));
  13. }
  14.  
  15. void setValues(int *array, int n, int max)
  16. {
  17. int i;
  18. for (i = 0; i < n; i++)
  19. {
  20. array[i] = rand() % max + 1;
  21. }
  22. }
  23.  
  24. __global__ void sum(int *x, int *y, int p, int *newX, int *newY, int *outX, int *outY, int n)
  25. {
  26. int index = threadIdx.x + blockIdx.x * blockDim.x;
  27. if (index < n)
  28. {
  29. newX[index] += (newX[index] * p);
  30. newY[index] += (newY[index] * 100);
  31. outX[index] = x[index] * newY[index] + y[index] * newX[index];
  32. outY[index] = y[index] * newY[index];
  33. int gcd = 1;
  34. for(int i = 1; i <= outX[index] && i <= outY[index]; ++i)
  35. {
  36. if (outX[index] % i == 0 && outY[index] % i == 0)
  37. gcd = i;
  38. }
  39. outX[index] = outX[index] / gcd;
  40. outY[index] = outY[index] / gcd;
  41.  
  42. }
  43. }
  44.  
  45. double calculateIncome(int *x, int *y, int *resX, int *resY, int n)
  46. {
  47. int i;
  48. double sum = 0;
  49. for (i = 0; i < n; i++)
  50. {
  51. sum += ((y[i] * resX[i] * 1.0) - (x[i] * resY[i])) / (y[i] * resY[i]);
  52. }
  53. return sum;
  54. }
  55.  
  56. void printArraySum(int *a, int *b, int *c, int *x, int *y, int *z, int n)
  57. {
  58. for (int i = 0; i < n; i++)
  59. {
  60. printf("%d/%d + %d/%d = %d/%d\n", a[i], x[i], b[i], y[i], c[i], z[i]);
  61. }
  62. }
  63.  
  64. int main(int argc, char **argv)
  65. {
  66. // razlomak
  67. int *x, *y, p;
  68.  
  69. x = allocateArray(K);
  70. setValues(x, K, 10);
  71.  
  72. y = allocateArray(K);
  73. setValues(y, K, 10);
  74.  
  75. p = 2;
  76.  
  77. // novo sredstvo
  78. int *newX = allocateArray(K);
  79. setValues(newX, K, 10);
  80. int *newY = allocateArray(K);
  81. setValues(newY, K, 10);
  82.  
  83. // output
  84. int *resX, *resY;
  85. resX = allocateArray(K);
  86. resY = allocateArray(K);
  87.  
  88. int *outX, *outY;
  89. outX = allocateArray(K);
  90. outY = allocateArray(K);
  91.  
  92. // Cuda mem prepare
  93. int size = K * sizeof(int);
  94. cudaMalloc((void **)&outX, size);
  95. cudaMalloc((void **)&outY, size);
  96.  
  97. // FALI
  98. int *d_x, *d_y, *d_newX, *d_newY;
  99. cudaMalloc((void **)&d_x, size);
  100. cudaMalloc((void **)&d_y, size);
  101. cudaMalloc((void **)&d_newX, size);
  102. cudaMalloc((void **)&d_newY, size);
  103.  
  104. cudaMemcpy(d_x, x, size, cudaMemcpyHostToDevice);
  105. cudaMemcpy(d_y, y, size, cudaMemcpyHostToDevice);
  106. cudaMemcpy(d_newX, newX, size, cudaMemcpyHostToDevice);
  107. cudaMemcpy(d_newY, newY, size, cudaMemcpyHostToDevice);
  108.  
  109. sum<<<(K + THREADS_PER_BLOCK) / THREADS_PER_BLOCK,THREADS_PER_BLOCK>>>(d_x, d_y, p, d_newX, d_newY, outX, outY, K);
  110.  
  111. cudaMemcpy(resX, outX, size, cudaMemcpyDeviceToHost);
  112. cudaMemcpy(resY, outY, size, cudaMemcpyDeviceToHost);
  113.  
  114. printArraySum(x, newX, resX, y, newY, resY, K);
  115.  
  116. printf("\n\n%lf", calculateIncome(x, y, resX, resY, K));
  117.  
  118. return 0;
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement