libMesh::Threads Namespace Reference

Classes

class  atomic
 
class  BlockedRange
 
class  BoolAcquire
 
class  NonConcurrentThread
 
class  RangeBody
 
class  recursive_mutex
 
class  scalable_allocator
 
class  spin_mutex
 
class  split
 
class  task_scheduler_init
 

Typedefs

typedef NonConcurrentThread Thread
 
typedef tbb::task_scheduler_init task_scheduler_init
 
typedef tbb::split split
 
typedef tbb::spin_mutex spin_mutex
 
typedef tbb::recursive_mutex recursive_mutex
 

Functions

template<typename Range , typename Body >
void parallel_for (const Range &range, const Body &body)
 
template<typename Range , typename Body , typename Partitioner >
void parallel_for (const Range &range, const Body &body, const Partitioner &)
 
template<typename Range , typename Body >
void parallel_reduce (const Range &range, Body &body)
 
template<typename Range , typename Body , typename Partitioner >
void parallel_reduce (const Range &range, Body &body, const Partitioner &)
 
template<typename Range >
unsigned int num_pthreads (Range &range)
 
template<typename Range , typename Body >
void * run_body (void *args)
 

Variables

bool in_threads = false
 
spin_mutex spin_mtx
 
recursive_mutex recursive_mtx
 

Detailed Description

The Threads namespace is for wrapper functions for common general multithreading algorithms and tasks.

Typedef Documentation

◆ recursive_mutex

typedef tbb::recursive_mutex libMesh::Threads::recursive_mutex

Recursive mutex. Implements mutual exclusion by busy-waiting in user space for the lock to be acquired. The same thread can acquire the same lock multiple times

Definition at line 216 of file threads_tbb.h.

◆ spin_mutex

typedef tbb::spin_mutex libMesh::Threads::spin_mutex

Spin mutex. Implements mutual exclusion by busy-waiting in user space for the lock to be acquired.

Definition at line 209 of file threads_tbb.h.

◆ split

typedef tbb::split libMesh::Threads::split

Dummy "splitting object" used to distinguish splitting constructors from copy constructors.

Definition at line 79 of file threads_tbb.h.

◆ task_scheduler_init

typedef tbb::task_scheduler_init libMesh::Threads::task_scheduler_init

Scheduler to manage threads.

Definition at line 73 of file threads_tbb.h.

◆ Thread

typedef tbb::tbb_thread libMesh::Threads::Thread

Use the non-concurrent placeholder.

Use std::thread when available.

Thread object abstraction that provides a basic constructor and support for join().

Definition at line 43 of file threads_none.h.

Function Documentation

◆ num_pthreads()

template<typename Range >
unsigned int libMesh::Threads::num_pthreads ( Range &  range)

Definition at line 214 of file threads_pthread.h.

References std::min(), and libMesh::n_threads().

215 {
216  std::size_t min = std::min((std::size_t)libMesh::n_threads(), range.size());
217  return min > 0 ? cast_int<unsigned int>(min) : 1;
218 }
unsigned int n_threads()
Definition: libmesh_base.h:96
long double min(long double a, double b)

◆ parallel_for() [1/2]

◆ parallel_for() [2/2]

template<typename Range , typename Body , typename Partitioner >
void libMesh::Threads::parallel_for ( const Range &  range,
const Body &  body,
const Partitioner partitioner 
)
inline

Execute the provided function object in parallel on the specified range with the specified partitioner.

Definition at line 87 of file threads_none.h.

References in_threads.

88 {
89  BoolAcquire b(in_threads);
90  body(range);
91 }
bool in_threads
Definition: threads.C:31

◆ parallel_reduce() [1/2]

template<typename Range , typename Body >
void libMesh::Threads::parallel_reduce ( const Range &  range,
Body &  body 
)
inline

◆ parallel_reduce() [2/2]

template<typename Range , typename Body , typename Partitioner >
void libMesh::Threads::parallel_reduce ( const Range &  range,
Body &  body,
const Partitioner partitioner 
)
inline

Execute the provided reduction operation in parallel on the specified range with the specified partitioner.

Definition at line 115 of file threads_none.h.

References in_threads.

116 {
117  BoolAcquire b(in_threads);
118  body(range);
119 }
bool in_threads
Definition: threads.C:31

◆ run_body()

template<typename Range , typename Body >
void* libMesh::Threads::run_body ( void *  args)

Definition at line 229 of file threads_pthread.h.

References libMesh::Threads::RangeBody< Range, Body >::body, and libMesh::Threads::RangeBody< Range, Body >::range.

230 {
231  RangeBody<Range, Body> * range_body = (RangeBody<Range, Body> *)args;
232 
233  Body & body = *range_body->body;
234  Range & range = *range_body->range;
235 
236  body(range);
237 
238  return nullptr;
239 }

Variable Documentation

◆ in_threads

bool libMesh::Threads::in_threads = false

A boolean which is true iff we are in a Threads:: function It may be useful to assert(!Threadsin_threads) in any code which is known to not be thread-safe.

Definition at line 31 of file threads.C.

Referenced by parallel_for(), parallel_reduce(), libMesh::MeshBase::point_locator(), and libMesh::MeshBase::sub_point_locator().

◆ recursive_mtx

Threads::recursive_mutex libMesh::Threads::recursive_mtx

A convenient recursive mutex object which can be used for obtaining locks.

Definition at line 30 of file threads.C.

◆ spin_mtx