timemory 3.3.0
Modular C++ Toolkit for Performance Analysis and Logging. Profiling API and Tools for C, C++, CUDA, Fortran, and Python. The C++ template API is essentially a framework to creating tools: it is designed to provide a unifying interface for recording various performance measurements alongside data logging and interfaces to other tools.
tim::ert::thread_barrier Class Reference

#include "timemory/ert/barrier.hpp"

+ Collaboration diagram for tim::ert::thread_barrier:

Public Types

using size_type = int64_t
 
using mutex_t = std::mutex
 
using condvar_t = std::condition_variable
 
using atomic_t = std::atomic< size_type >
 
using lock_t = std::unique_lock< mutex_t >
 

Public Member Functions

 thread_barrier (size_t nthreads)
 
 thread_barrier (const thread_barrier &)=delete
 
 thread_barrier (thread_barrier &&)=delete
 
thread_barrieroperator= (const thread_barrier &)=delete
 
thread_barrieroperator= (thread_barrier &&)=delete
 
size_type size () const
 
void spin_wait ()
 
void cv_wait ()
 
void notify_wait ()
 
bool is_master () const
 

Detailed Description

Definition at line 50 of file barrier.hpp.

Member Typedef Documentation

◆ atomic_t

Definition at line 56 of file barrier.hpp.

◆ condvar_t

using tim::ert::thread_barrier::condvar_t = std::condition_variable

Definition at line 55 of file barrier.hpp.

◆ lock_t

using tim::ert::thread_barrier::lock_t = std::unique_lock<mutex_t>

Definition at line 57 of file barrier.hpp.

◆ mutex_t

Definition at line 54 of file barrier.hpp.

◆ size_type

Definition at line 53 of file barrier.hpp.

Constructor & Destructor Documentation

◆ thread_barrier() [1/3]

tim::ert::thread_barrier::thread_barrier ( size_t  nthreads)
inlineexplicit

Definition at line 60 of file barrier.hpp.

61 : m_master(std::this_thread::get_id())
62 , m_num_threads(nthreads)
63 , m_notify(0)
64 , m_future(m_promise.get_future().share())
65 {}

◆ thread_barrier() [2/3]

tim::ert::thread_barrier::thread_barrier ( const thread_barrier )
delete

◆ thread_barrier() [3/3]

tim::ert::thread_barrier::thread_barrier ( thread_barrier &&  )
delete

Member Function Documentation

◆ cv_wait()

void tim::ert::thread_barrier::cv_wait ( )
inline

Definition at line 109 of file barrier.hpp.

110 {
111 if(is_master())
112 {
113#if defined(TIMEMORY_INTERNAL_TESTING)
114 TIMEMORY_EXCEPTION("master thread calling worker wait function\n");
115#else
116 return;
117#endif
118 }
119
120 lock_t lk(m_mutex);
121 ++m_counter;
122 ++m_waiting;
123 m_cv.wait(lk, [&] { return m_counter >= m_num_threads; });
124 m_cv.notify_one();
125 --m_waiting;
126 if(m_waiting == 0)
127 m_counter = 0; // reset barrier
128 }
bool is_master() const
Definition: barrier.hpp:161
std::unique_lock< mutex_t > lock_t
Definition: barrier.hpp:57
#define TIMEMORY_EXCEPTION(...)
Definition: types.hpp:138

References is_master(), and TIMEMORY_EXCEPTION.

◆ is_master()

bool tim::ert::thread_barrier::is_master ( ) const
inline

Definition at line 161 of file barrier.hpp.

161{ return std::this_thread::get_id() == m_master; }

Referenced by cv_wait(), notify_wait(), and spin_wait().

◆ notify_wait()

void tim::ert::thread_barrier::notify_wait ( )
inline

Definition at line 132 of file barrier.hpp.

133 {
134 if(is_master())
135 {
136 lock_t lk(m_mutex);
137 while(m_notify.load() < m_num_threads)
138 m_cv.wait(lk);
139 m_promise.set_value();
140 while(m_notify.load() > 0)
141 {
142 }
143 std::promise<void> _ptmp;
144 std::shared_future<void> _ftmp = _ptmp.get_future().share();
145 std::swap(m_promise, _ptmp);
146 std::swap(m_future, _ftmp);
147 }
148 else
149 {
150 {
151 lock_t lk(m_mutex);
152 ++m_notify;
153 m_cv.notify_one();
154 }
155 m_future.wait();
156 --m_notify;
157 }
158 }

References is_master().

◆ operator=() [1/2]

thread_barrier & tim::ert::thread_barrier::operator= ( const thread_barrier )
delete

◆ operator=() [2/2]

thread_barrier & tim::ert::thread_barrier::operator= ( thread_barrier &&  )
delete

◆ size()

size_type tim::ert::thread_barrier::size ( ) const
inline

Definition at line 73 of file barrier.hpp.

73{ return m_num_threads; }

◆ spin_wait()

void tim::ert::thread_barrier::spin_wait ( )
inline

Definition at line 76 of file barrier.hpp.

77 {
78 if(is_master())
79 {
80#if defined(TIMEMORY_INTERNAL_TESTING)
81 TIMEMORY_EXCEPTION("master thread calling worker wait function\n");
82#else
83 return;
84#endif
85 }
86
87 {
88 lock_t lk(m_mutex);
89 ++m_counter;
90 ++m_waiting;
91 }
92
93 while(m_counter < m_num_threads)
94 {
95 while(spin_lock.test_and_set(std::memory_order_acquire)) // acquire lock
96 ; // spin
97 spin_lock.clear(std::memory_order_release);
98 }
99
100 {
101 lock_t lk(m_mutex);
102 --m_waiting;
103 if(m_waiting == 0)
104 m_counter = 0; // reset barrier
105 }
106 }

References is_master(), and TIMEMORY_EXCEPTION.


The documentation for this class was generated from the following file: