Ajout de l'ensemble du workspace.
[GPU.git] / WCudaMSE / Student_OMP / src / cpp / core / omp / 02_pi / 06_pi_for_atomic.cpp
1 #include <omp.h>
2 #include "00_pi_tools.h"
3 #include "OmpTools.h"
4
5 /*----------------------------------------------------------------------*\
6 |* Declaration *|
7 \*---------------------------------------------------------------------*/
8
9 /*--------------------------------------*\
10 |* Imported *|
11 \*-------------------------------------*/
12
13
14
15 /*--------------------------------------*\
16 |* Public *|
17 \*-------------------------------------*/
18
19 bool isPiOMPforAtomic_Ok(int n);
20
21 /*--------------------------------------*\
22 |* Private *|
23 \*-------------------------------------*/
24
25 static double piOMPforAtomic(int n);
26
27 /*----------------------------------------------------------------------*\
28 |* Implementation *|
29 \*---------------------------------------------------------------------*/
30
31 /*--------------------------------------*\
32 |* Public *|
33 \*-------------------------------------*/
34
35 bool isPiOMPforAtomic_Ok(int n)
36 {
37 return isAlgoPI_OK(piOMPforAtomic, n, "Pi OMP for atomic");
38 }
39
40 /*--------------------------------------*\
41 |* Private *|
42 \*-------------------------------------*/
43
44 /**
45 * synchronisation couteuse!
46 */
47 double piOMPforAtomic(int n)
48 {
49 double sum = 0;
50 double xi;
51 const double DX = 1.0/(double)n;
52
53 #pragma omp parralel for private(xi)
54 for (int i = 0; i < n; i++)
55 {
56 xi = i*DX;
57 #pragma omp atomic
58 sum += fpi(xi); // Uniquement l'operateur += est atomi, 'fpi' est exécuté en parralèle.
59 }
60
61 return sum * DX;
62 }
63
64 /*----------------------------------------------------------------------*\
65 |* End *|
66 \*---------------------------------------------------------------------*/
67