Actual source code: openmp.c

petsc-3.3-p5 2012-12-01
  1: #include <../src/sys/threadcomm/impls/openmp/openmpimpl.h>
  2: #include <omp.h>

  4: PetscInt PetscThreadCommGetRank_OpenMP(void)
  5: {
  6:   return omp_get_thread_num();
  7: }

  9: EXTERN_C_BEGIN
 12: PetscErrorCode PetscThreadCommCreate_OpenMP(PetscThreadComm tcomm)
 13: {

 17:   PetscStrcpy(tcomm->type,OPENMP);
 18:   tcomm->ops->runkernel = PetscThreadCommRunKernel_OpenMP;
 19:   tcomm->ops->getrank   = PetscThreadCommGetRank_OpenMP;
 20:   return(0);
 21: }
 22: EXTERN_C_END
 23: 
 26: PetscErrorCode PetscThreadCommRunKernel_OpenMP(MPI_Comm comm,PetscThreadCommJobCtx job)
 27: {
 29:   PetscThreadComm tcomm;
 30:   PetscInt        trank=0;

 33:   PetscCommGetThreadComm(comm,&tcomm);
 34: #pragma omp parallel num_threads(tcomm->nworkThreads) shared(comm,job) private(trank,ierr)
 35:   {
 36:     trank = omp_get_thread_num();
 37:     PetscRunKernel(trank,job->nargs,job);
 38:   }
 39:   return(0);
 40: }