HPMC User Guide v 1.00
© 2022 Bassem W. Jamaleddine
Consider the following simple program to measure the DP GFLops by running many threads over OMP.
1. #include <stdio.h> 2. #include <stdlib.h> 3. #include <omp.h> 4. 5. unsigned int const SIZE=16; 6. unsigned int const ITER=48000000; 7. 8. extern double elapsedTime(void); 9. 10. int main() 11. { 12. double startTime, duration; 13. int i; 14. __declspec(aligned(64)) double a[SIZE],b[SIZE],c[SIZE]; 15. // initialize 16. for (i=0;i<SIZE;i++) { 17. c[i]=b[i]=a[i]=(double)rand(); 18. } 19. // warmup 20. #pragma omp parallel for 21. for(i=0;i<ITER;i++) { 22. #pragma vector aligned(a,b,c) 23. a[0:SIZE]=b[0:SIZE]*c[0:SIZE]+a[0:SIZE]; 24. } 25. startTime = elapsedTime(); 26. #pragma omp parallel for 27. for(i=0;i<ITER;i++) { 28. #pragma vector aligned(a,b,c) 29. a[0:SIZE]=b[0:SIZE]*c[0:SIZE]+a[0:SIZE]; 30. } 31. duration = elapsedTime() - startTime; 32. double Gflop = 2*SIZE*ITER/1e+9; 33. double Gflops = Gflop/duration; 34. printf("Running %d openmp threads\n", omp_get_max_threads()); 35. printf("DP GFlops = %f\n", Gflops); 36. return 0; 37. }
Running the program on the HPMC's MIC coprocessor:
# 12:46 root@HPMC9: ~/coding # xphi gigaflop_xphi
12:46 root@HPMC9: ~/coding # xphi gigaflop_xphi Running 224 openmp threads DP GFlops = 154310202251.497009
Running the program on the HPMC host:
# 12:50 root@HPMC9: ~/coding # ./gigaflop_hos
12:50 root@HPMC9: ~/coding # ./gigaflop_hos Running 112 openmp threads DP GFlops = 139649512.149654