Date: 2013-07-02T14:39:35+00:00

Actual source code: tcpthreadimpl.h
petsc-3.4.2 2013-07-02

      5: #include <petsc-private/threadcommimpl.h>

      7: #if defined(PETSC_HAVE_PTHREAD_H)
      8: #include <pthread.h>
      9: #elif defined(PETSC_HAVE_WINPTHREADS_H)
     10: #include "winpthreads.h"       /* http://locklessinc.com/downloads/winpthreads.h */
     11: #endif

     13: /*
     14:   PetscPThreadCommSynchronizationType - Type of thread synchronization for pthreads communicator.

     16: $ PTHREADSYNC_LOCKFREE -  A lock-free variant.

     18: */
     19: typedef enum {PTHREADSYNC_LOCKFREE} PetscPThreadCommSynchronizationType;
     20: extern const char *const PetscPThreadCommSynchronizationTypes[];

     22: /*
     23:   PetscPThreadCommAffinityPolicy - Core affinity policy for pthreads

     25: $ PTHREADAFFPOLICY_ALL     - threads can run on any core. OS decides thread scheduling
     26: $ PTHREADAFFPOLICY_ONECORE - threads can run on only one core.
     27: $ PTHREADAFFPOLICY_NONE    - No set affinity policy. OS decides thread scheduling
     28: */
     29: typedef enum {PTHREADAFFPOLICY_ALL,PTHREADAFFPOLICY_ONECORE,PTHREADAFFPOLICY_NONE} PetscPThreadCommAffinityPolicyType;
     30: extern const char *const PetscPTheadCommAffinityPolicyTypes[];

     32: typedef enum {PTHREADPOOLSPARK_SELF} PetscPThreadCommPoolSparkType;
     33: extern const char *const PetscPThreadCommPoolSparkTypes[];

     35: /*
     36:    PetscThreadComm_PThread - The main data structure to manage the thread
     37:    communicator using pthreads. This data structure is shared by NONTHREADED
     38:    and PTHREAD threading models. For NONTHREADED threading model, no extra
     39:    pthreads are created
     40: */
     41: struct _p_PetscThreadComm_PThread {
     42:   PetscInt       nthreads;                   /* Number of threads created */
     43:   pthread_t      *tid;                       /* thread ids */
     44:   pthread_attr_t *attr;                      /* thread attributes */
     45: #if defined(PETSC_HAVE_SCHED_CPU_SET_T)
     46:   cpu_set_t *cpuset;
     47: #endif
     48:   PetscBool ismainworker;                    /* Is the main thread also a work thread?*/
     49:   PetscInt  *granks;                         /* Thread ranks - if main thread is a worker then main thread
     50:                                                 rank is 0 and ranks for other threads start from 1,
     51:                                                 otherwise the thread ranks start from 0.
     52:                                                 These ranks are with respect to the first initialized thread pool */
     53:   PetscInt thread_num_start;                 /* index for the first created thread (= 1 if the main thread is a worker
     54:                                                 else 0) */
     55:   PetscPThreadCommSynchronizationType sync;   /* Synchronization type */
     56:   PetscPThreadCommAffinityPolicyType  aff;    /* affinity policy */
     57:   PetscPThreadCommPoolSparkType       spark;  /* Type for sparking threads */
     58:   PetscBool                           synchronizeafter; /* Whether the main thread should be blocked till all threads complete the given kernel */

     60:   PetscErrorCode (*initialize)(PetscThreadComm);
     61:   PetscErrorCode (*finalize)(PetscThreadComm);
     62: };

     64: typedef struct _p_PetscThreadComm_PThread *PetscThreadComm_PThread;

     66: #if defined(PETSC_PTHREAD_LOCAL)
     67: extern PETSC_PTHREAD_LOCAL PetscInt PetscPThreadRank; /* Rank of the calling thread ... thread local variable */
     68: #else
     69: extern pthread_key_t PetscPThreadRankkey;
     70: #endif

     72: #if defined(PETSC_CPU_RELAX)
     73: #define PetscCPURelax() do {PETSC_CPU_RELAX();} while (0)
     74: #else
     75: #define PetscCPURelax() do { } while (0)
     76: #endif

     78: PETSC_EXTERN PetscErrorCode PetscThreadCommCreate_PThread(PetscThreadComm);

     80: extern PetscErrorCode PetscPThreadCommInitialize_LockFree(PetscThreadComm);
     81: extern PetscErrorCode PetscPThreadCommFinalize_LockFree(PetscThreadComm);
     82: extern PetscErrorCode PetscThreadCommRunKernel_PThread_LockFree(PetscThreadComm,PetscThreadCommJobCtx);
     83: extern PetscErrorCode PetscThreadCommBarrier_PThread_LockFree(PetscThreadComm);

     85: #if defined(PETSC_HAVE_SCHED_CPU_SET_T)
     86: extern void PetscPThreadCommDoCoreAffinity();
     87: #endif

     90: #endif