Prev Next

@(@\newcommand{\W}[1]{ \; #1 \; } \newcommand{\R}[1]{ {\rm #1} } \newcommand{\B}[1]{ {\bf #1} } \newcommand{\D}[2]{ \frac{\partial #1}{\partial #2} } \newcommand{\DD}[3]{ \frac{\partial^2 #1}{\partial #2 \partial #3} } \newcommand{\Dpow}[2]{ \frac{\partial^{#1}}{\partial {#2}^{#1}} } \newcommand{\dpow}[2]{ \frac{ {\rm d}^{#1}}{{\rm d}\, {#2}^{#1}} }@)@
Specifications for A Team of AD Threads

include "team_thread.hpp"
ok   = team_create(num_threads)
ok   = team_work(worker)
ok   = team_destroy()
name = team_name()

These routines start, use, and stop a team of threads that can be used with the CppAD type AD<double>. For example, these could be OpenMP threads, pthreads, or Boost threads to name a few.

Calls to the routines team_create, team_work, and team_destroy, must all be done by the master thread; i.e., thread_num must be zero. In addition, they must all be done in sequential execution mode; i.e., when the master thread is the only thread that is running (in_parallel must be false).

The argument num_threads > 0 has type size_t and specifies the number of threads in this team. This initializes both AD<double> and team_work to be used with num_threads . If num_threads > 1 , num_threads - 1 new threads are created and put in a waiting state until team_work is called.

This routine may be called one or more times between the call to team_create and team_destroy. The argument worker has type bool worker(void) . Each call to team_work runs num_threads versions of worker with the corresponding value of thread_num between zero and num_threads - 1 and different for each thread,

This routine terminates all the other threads except for thread number zero; i.e., it terminates the threads corresponding to
thread_num = 1 , ... , num_threads-1

This routines returns a name that identifies this thread_team. The return value has prototype
     const char* 
and is a statically allocated '\0' terminated C string.

The return value ok has type bool. It is false if an error is detected during the corresponding call. Otherwise it is true.

Example Use
Example use of these specifications can be found in the file team_example.cpp .

Example Implementation
Example implementations of these specifications can be found in the files:
team_openmp.cpp OpenMP Implementation of a Team of AD Threads
team_bthread.cpp Boost Thread Implementation of a Team of AD Threads
team_pthread.cpp Pthread Implementation of a Team of AD Threads

Speed Test of Implementation
Speed tests of using CppAD with the team implementations above can be found in:
harmonic.cpp Multi-Threading Harmonic Summation Example / Test
multi_newton.cpp Multi-Threaded Newton Method Example / Test

# include <cstddef> // for size_t

extern bool team_create(size_t num_threads);
extern bool team_work(void worker(void));
extern bool team_destroy(void);
extern const char* team_name(void);

Input File: example/multi_thread/team_thread.hpp