ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
tool_threading.h
Go to the documentation of this file.
1#ifndef TOOL_THREADING_H
2#define TOOL_THREADING_H
3
4#ifdef _OPENMP
5#include <omp.h>
6#endif
7
8#include <functional>
9
10namespace ModuleBase
11{
12
13//==========================================================
14// NAME : TASK_DIST_1D
15// Distributing 1d tasks by worker id
16//==========================================================
17template <typename T_task, typename T_out>
18inline void TASK_DIST_1D(int nworker, int iworker, T_task ntask, T_out& start, T_out& len)
19{
20 if (nworker == 1)
21 {
22 start = 0;
23 len = ntask;
24 }
25 else
26 {
27 const T_task tlen = ntask / nworker;
28 const T_task trem = ntask - tlen * nworker;
29 if (iworker < trem)
30 {
31 start = tlen * iworker + iworker;
32 len = tlen + 1;
33 }
34 else
35 {
36 start = tlen * iworker + trem;
37 len = tlen;
38 }
39 }
40}
41
42template <typename T_task, typename T_out>
43inline void BLOCK_TASK_DIST_1D(int nworker, int iworker, T_task ntask, T_task block_size, T_out& start, T_out& len)
44{
45 if (nworker == 1)
46 {
47 start = 0;
48 len = ntask;
49 }
50 else
51 {
52 const T_task nblock = (ntask + block_size - 1) / block_size;
53 const T_task blen = nblock / nworker;
54 const T_task brem = nblock - blen * nworker;
55 if (iworker < brem)
56 {
57 start = blen * iworker + iworker;
58 len = blen + 1;
59 }
60 else
61 {
62 start = blen * iworker + brem;
63 len = blen;
64 }
65 start *= block_size;
66 len *= block_size;
67 if (start > ntask)
68 {
69 start = ntask;
70 len = 0;
71 return;
72 }
73 if (start + len > ntask)
74 {
75 len = ntask - start;
76 }
77 }
78}
79
80inline void OMP_PARALLEL(const std::function<void(int, int)> &f)
81{
82#ifdef _OPENMP
83 #pragma omp parallel
84 {
85 f(omp_get_num_threads(), omp_get_thread_num());
86 }
87#else
88 f(1, 0);
89#endif
90}
91
92inline void TRY_OMP_PARALLEL(const std::function<void(int, int)> &f)
93{
94#ifdef _OPENMP
95 if (!omp_in_parallel())
96 {
97 OMP_PARALLEL(f);
98 }
99 else
100#endif
101 {
102 f(1, 0);
103 }
104}
105
106}
107
108#endif
Definition array_pool.h:6
void BLOCK_TASK_DIST_1D(int nworker, int iworker, T_task ntask, T_task block_size, T_out &start, T_out &len)
Definition tool_threading.h:43
void TASK_DIST_1D(int nworker, int iworker, T_task ntask, T_out &start, T_out &len)
Definition tool_threading.h:18
void TRY_OMP_PARALLEL(const std::function< void(int, int)> &f)
Definition tool_threading.h:92
void OMP_PARALLEL(const std::function< void(int, int)> &f)
Definition tool_threading.h:80
iclock::time_point start
Definition test_partition.cpp:22