Actual source code: tcopenmp.c

petsc-3.4.2 2013-07-02
  1: #define PETSC_DESIRE_FEATURE_TEST_MACROS
  2: #include <../src/sys/threadcomm/impls/openmp/tcopenmpimpl.h>
  3: #include <omp.h>

  5: PetscErrorCode PetscThreadCommGetRank_OpenMP(PetscInt *trank)
  6: {
  7:   *trank =  omp_get_thread_num();
  8:   return 0;
  9: }

 13: PETSC_EXTERN PetscErrorCode PetscThreadCommCreate_OpenMP(PetscThreadComm tcomm)
 14: {

 18:   PetscStrcpy(tcomm->type,OPENMP);
 19:   tcomm->ops->runkernel = PetscThreadCommRunKernel_OpenMP;
 20:   tcomm->ops->getrank   = PetscThreadCommGetRank_OpenMP;
 21: #pragma omp parallel num_threads(tcomm->nworkThreads) shared(tcomm)
 22:   {
 23: #if defined(PETSC_HAVE_SCHED_CPU_SET_T)
 24:     cpu_set_t mset;
 25:     PetscInt  ncores, icorr,trank;
 26:     PetscGetNCores(&ncores);
 27:     CPU_ZERO(&mset);
 28:     trank = omp_get_thread_num();
 29:     icorr = tcomm->affinities[trank]%ncores;
 30:     CPU_SET(icorr,&mset);
 31:     sched_setaffinity(0,sizeof(cpu_set_t),&mset);
 32: #endif
 33:   }
 34:   return(0);
 35: }

 39: PetscErrorCode PetscThreadCommRunKernel_OpenMP(PetscThreadComm tcomm,PetscThreadCommJobCtx job)
 40: {
 41:   PetscInt        trank=0;

 44: #pragma omp parallel num_threads(tcomm->nworkThreads) shared(job) private(trank)
 45:   {
 46:     trank = omp_get_thread_num();
 47:     PetscRunKernel(trank,job->nargs,job);
 48:     job->job_status[trank] = THREAD_JOB_COMPLETED;
 49:   }
 50:   return(0);
 51: }