Advertisement
Guest User

Untitled

a guest
Feb 11th, 2016
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.59 KB | None | 0 0
  1. #include <omp.h>
  2. #include <math.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. void integrate_cpu(int q, int n, float *a, float *b, float *z) {
  7.  
  8. #pragma omp parallel
  9. {
  10.     int i, j;
  11.     float h, w, x;
  12.     float res;
  13.  
  14. #pragma omp for
  15.     for (i = 0; i < n; ++i) {
  16.         res = 0.0f;
  17.         h = (b[i] - a[i]) / (q - 1);
  18.         w = (b[i] - a[i]) / q;
  19.         for (j = 0; j < q; ++j) {
  20.             x = a[i] + j * h;
  21.             res += 1.0f / sqrtf(x);
  22.         }
  23.         z[i] = w * res;
  24.  
  25.         if (omp_get_thread_num() == 0 && 100ul * (i + 1) / n != 100ul * i / n) {
  26.             printf("  [% 3d%%]\r", omp_get_num_threads() * 100ul * (i + 1) / n);
  27.             fflush (stdout);
  28.         }
  29.     }
  30. }
  31. }
  32.  
  33.  
  34. int main()
  35. {
  36.     float *a, *b, *z_exact, *z_cpu, *z_gpu;
  37.     float time_cpu, time_gpu, err_cpu, err_gpu;
  38.     int n, q, i;
  39.     unsigned long long flops;
  40.  
  41.     q = 1000;
  42.     n = 1 << 25;
  43.  
  44.     flops = 4ul * (unsigned long long) n * (unsigned long long) q
  45.         + 6ul * (unsigned long long) n;
  46.  
  47.     srand(42);
  48.  
  49.  
  50.     a = (float*) malloc(n * sizeof(float));
  51.     b = (float*) malloc(n * sizeof(float));
  52.     z_exact = (float*) malloc(n * sizeof(float));
  53.     z_cpu = (float*) malloc(n * sizeof(float));
  54.     z_gpu = (float*) malloc(n * sizeof(float));
  55.  
  56.     /*
  57.     * Init intervals within [[1,2],[2.5,3.5]]
  58.     */
  59.     for (i = 0; i < n; ++i) {
  60.         a[i] = 1.0f + (float) rand() / (float) RAND_MAX;
  61.         b[i] = 2.5f + (float) rand() / (float) RAND_MAX;
  62.     }
  63.  
  64.     /*
  65.     * Exact value of \int_a^b 1 / sqrt(x) dx = 2 * (sqrt(b) - sqrt(a))
  66.     */
  67.     for (i = 0; i < n; ++i) {
  68.         z_exact[i] = 2.0f * (sqrtf(b[i]) - sqrtf(a[i]));
  69.     }
  70.     printf("exact:\n");
  71.  
  72.     /*
  73.     * CPU computation of the integrals.
  74.     */
  75.     integrate_cpu(q, n, a, b, z_cpu);
  76.  
  77.     return 0;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement