Advertisement
Guest User

Untitled

a guest
Dec 18th, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.52 KB | None | 0 0
  1. #include "cuda_runtime.h"
  2. #include "device_launch_parameters.h"
  3.  
  4. #include<stdio.h>
  5. #include<chrono>
  6. #include<iostream>
  7.  
  8. using namespace std::chrono;
  9. using namespace std;
  10.  
  11. __global__
  12. void check_kernel(unsigned long long int* number, bool* prime_device, int counter) {
  13. unsigned long long int i = blockIdx.x*blockDim.x + threadIdx.x + counter;
  14.  
  15. if (*number % i == 0 && i < *number)
  16. {
  17. *prime_device = false;
  18. }
  19.  
  20. }
  21.  
  22. unsigned long long int get_number() {
  23. unsigned long long int number;
  24. cout << "Give the program a number to check: ";
  25. cin >> number;
  26. return number;
  27. }
  28.  
  29. bool check_non_parallel(unsigned long long int number) {
  30. long double square_root = sqrt(number);
  31. bool prime = true;
  32.  
  33. high_resolution_clock::time_point start = steady_clock::now();
  34. for (unsigned long long int i = 2; i <= square_root; i++) {
  35. if (number % i == 0) {
  36. prime = false;
  37. break;
  38. }
  39. }
  40. high_resolution_clock::time_point end = steady_clock::now();
  41. auto diff = duration_cast<microseconds>(end - start);
  42. cout << "NON-Parallel (CPU) checking took: " << diff.count() << " microseconds." << endl;
  43.  
  44. return prime;
  45. }
  46.  
  47. bool check_parallel(unsigned long long int number, bool prime) {
  48. cudaEvent_t start, stop;
  49. unsigned long long int* number_device;
  50. number_device = &number;
  51. bool* prime_device;
  52. prime_device = &prime;
  53.  
  54. int threadsperblock = 256, counter = 0;
  55. int N = 2048;
  56. int blockspergrid = (N + threadsperblock - 1) / threadsperblock;
  57. float time;
  58. long double square_root = sqrt(number);
  59.  
  60. cudaEventCreate(&start);
  61. cudaEventRecord(start, 0);
  62.  
  63. while (counter <= square_root)
  64. {
  65. check_kernel <<<blockspergrid, threadsperblock >>> (number_device, prime_device, counter);
  66. counter += threadsperblock * blockspergrid;
  67. }
  68. cudaEventCreate(&stop);
  69. cudaEventRecord(stop, 0);
  70. cudaEventSynchronize(stop);
  71.  
  72. cudaEventElapsedTime(&time, start, stop);
  73. printf("Parallel (GPU) checking took: %f ms\n", time);
  74. prime_device = false;
  75. return *prime_device;
  76. }
  77.  
  78. cudaError_t addWithCuda(unsigned long long int number, bool *prime)
  79. {
  80. unsigned long long int *dev_number;
  81. bool *dev_prime;
  82.  
  83. cudaError_t cudaStatus;
  84. float elapsedTime;
  85.  
  86. int threadsPerBlock = 128;
  87. int N = 2048;
  88. int blocksInGrid = (N + threadsPerBlock - 1) / threadsPerBlock;
  89. int times = 0;
  90.  
  91. high_resolution_clock::time_point start = steady_clock::now();
  92. while (times <= sqrt(number))
  93. {
  94. check_kernel << <blocksInGrid, threadsPerBlock >> > (dev_number, dev_prime, times);
  95. times += threadsPerBlock * blocksInGrid;
  96. }
  97. high_resolution_clock::time_point end = steady_clock::now();
  98. auto diff = duration_cast<microseconds>(end - start);
  99. cout << "Parallel (GPU) checking took: " << diff.count() << " microseconds. "<< endl;
  100.  
  101. cudaStatus = cudaMemcpy(prime, dev_prime, sizeof(bool), cudaMemcpyDeviceToHost);
  102. if (cudaStatus != cudaSuccess) {
  103. fprintf(stderr, "cudaMemcpy failed!");
  104. }
  105. cudaFree(dev_prime);
  106. cudaFree(dev_number);
  107.  
  108. return cudaStatus;
  109. }
  110.  
  111.  
  112. int main(){
  113. unsigned long long int number;
  114. bool prime_host, prime_device;
  115.  
  116. int threadsperblock;
  117. int blockspergrid;
  118.  
  119. while (true) {
  120. cudaError_t cudaStatus;
  121. prime_device = true;
  122. number = get_number();
  123. prime_host = check_non_parallel(number);
  124. cudaStatus = addWithCuda(number, &prime_device);
  125.  
  126. cout << prime_device << endl;
  127.  
  128.  
  129. if (prime_host) {
  130. cout << "-------- THE NUMBER IS PRIME --------" << endl << endl;
  131. }
  132. else {
  133. cout << "-------- THE NUMBER IS NOT PRIME --------" << endl << endl;
  134. }
  135. }
  136.  
  137. system("PAUSE");
  138. return true;
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement