Lines Matching refs:ctrl
39 static inline PetscErrorCode PetscOmpCtrlCreateBarrier(PetscOmpCtrl ctrl) in PetscOmpCtrlCreateBarrier() argument
55 if (ctrl->is_omp_master) { in PetscOmpCtrlCreateBarrier()
66 PetscCallMPI(MPI_Bcast(pathname, PETSC_MAX_PATH_LEN, MPI_CHAR, 0, ctrl->omp_comm)); in PetscOmpCtrlCreateBarrier()
68 PetscCallMPI(MPI_Barrier(ctrl->omp_comm)); in PetscOmpCtrlCreateBarrier()
71 PetscCallMPI(MPI_Bcast(pathname, PETSC_MAX_PATH_LEN, MPI_CHAR, 0, ctrl->omp_comm)); in PetscOmpCtrlCreateBarrier()
77 PetscCallMPI(MPI_Barrier(ctrl->omp_comm)); in PetscOmpCtrlCreateBarrier()
80 size = ctrl->is_omp_master ? sizeof(pthread_barrier_t) : 0; in PetscOmpCtrlCreateBarrier()
81 …PetscCallMPI(MPI_Win_allocate_shared(size, 1, MPI_INFO_NULL, ctrl->omp_comm, &baseptr, &ctrl->omp_… in PetscOmpCtrlCreateBarrier()
82 PetscCallMPI(MPI_Win_shared_query(ctrl->omp_win, 0, &size, &disp_unit, &baseptr)); in PetscOmpCtrlCreateBarrier()
84 ctrl->barrier = (pthread_barrier_t *)baseptr; in PetscOmpCtrlCreateBarrier()
87 if (ctrl->is_omp_master) { in PetscOmpCtrlCreateBarrier()
88 PetscCallMPI(MPI_Comm_size(ctrl->omp_comm, &ctrl->omp_comm_size)); in PetscOmpCtrlCreateBarrier()
91 … PetscCallExternal(pthread_barrier_init, ctrl->barrier, &attr, (unsigned int)ctrl->omp_comm_size); in PetscOmpCtrlCreateBarrier()
96 PetscCallMPI(MPI_Barrier(ctrl->omp_comm)); in PetscOmpCtrlCreateBarrier()
101 static inline PetscErrorCode PetscOmpCtrlDestroyBarrier(PetscOmpCtrl ctrl) in PetscOmpCtrlDestroyBarrier() argument
105 PetscCallMPI(MPI_Barrier(ctrl->omp_comm)); in PetscOmpCtrlDestroyBarrier()
106 if (ctrl->is_omp_master) PetscCallExternal(pthread_barrier_destroy, ctrl->barrier); in PetscOmpCtrlDestroyBarrier()
109 PetscCallExternal(munmap, ctrl->barrier, sizeof(pthread_barrier_t)); in PetscOmpCtrlDestroyBarrier()
111 PetscCallMPI(MPI_Win_free(&ctrl->omp_win)); in PetscOmpCtrlDestroyBarrier()
135 PetscOmpCtrl ctrl; in PetscOmpCtrlCreate() local
143 PetscCall(PetscNew(&ctrl)); in PetscOmpCtrlCreate()
148 PetscCallExternal(hwloc_topology_init, &ctrl->topology); in PetscOmpCtrlCreate()
151 …PetscCallExternal(hwloc_topology_set_all_types_filter, ctrl->topology, HWLOC_TYPE_FILTER_KEEP_NONE… in PetscOmpCtrlCreate()
152 …PetscCallExternal(hwloc_topology_set_type_filter, ctrl->topology, HWLOC_OBJ_CORE, HWLOC_TYPE_FILTE… in PetscOmpCtrlCreate()
154 PetscCallExternal(hwloc_topology_load, ctrl->topology); in PetscOmpCtrlCreate()
172 …um_packages = hwloc_get_nbobjs_by_type(ctrl->topology, HWLOC_OBJ_PACKAGE) <= 0 ? 1 : hwloc_get_nbo… in PetscOmpCtrlCreate()
173 …num_cores = hwloc_get_nbobjs_by_type(ctrl->topology, HWLOC_OBJ_CORE) <= 0 ? 1 : hwloc_get_nbobj… in PetscOmpCtrlCreate()
188 PetscCallMPI(MPI_Comm_split(shm_comm, color, 0 /*key*/, &ctrl->omp_comm)); in PetscOmpCtrlCreate()
191 PetscCallMPI(MPI_Comm_rank(ctrl->omp_comm, &omp_rank)); in PetscOmpCtrlCreate()
193 ctrl->is_omp_master = PETSC_TRUE; /* master */ in PetscOmpCtrlCreate()
196 ctrl->is_omp_master = PETSC_FALSE; /* slave */ in PetscOmpCtrlCreate()
199 PetscCallMPI(MPI_Comm_split(petsc_comm, color, 0 /*key*/, &ctrl->omp_master_comm)); in PetscOmpCtrlCreate()
206 PetscCall(PetscOmpCtrlCreateBarrier(ctrl)); in PetscOmpCtrlCreate()
213 ctrl->cpuset = hwloc_bitmap_alloc(); in PetscOmpCtrlCreate()
214 PetscCheck(ctrl->cpuset, PETSC_COMM_SELF, PETSC_ERR_LIB, "hwloc_bitmap_alloc() failed"); in PetscOmpCtrlCreate()
215 PetscCallExternal(hwloc_get_cpubind, ctrl->topology, ctrl->cpuset, HWLOC_CPUBIND_PROCESS); in PetscOmpCtrlCreate()
218 …nr_cpu_ulongs = (hwloc_bitmap_last(hwloc_topology_get_topology_cpuset(ctrl->topology)) + sizeof(un… in PetscOmpCtrlCreate()
221 cpu_ulongs[0] = hwloc_bitmap_to_ulong(ctrl->cpuset); in PetscOmpCtrlCreate()
223 …for (PetscMPIInt i = 0; i < nr_cpu_ulongs; i++) cpu_ulongs[i] = hwloc_bitmap_to_ith_ulong(ctrl->cp… in PetscOmpCtrlCreate()
226 …scCallMPI(MPI_Reduce(ctrl->is_omp_master ? MPI_IN_PLACE : cpu_ulongs, cpu_ulongs, nr_cpu_ulongs, M… in PetscOmpCtrlCreate()
228 if (ctrl->is_omp_master) { in PetscOmpCtrlCreate()
229 ctrl->omp_cpuset = hwloc_bitmap_alloc(); in PetscOmpCtrlCreate()
230 PetscCheck(ctrl->omp_cpuset, PETSC_COMM_SELF, PETSC_ERR_LIB, "hwloc_bitmap_alloc() failed"); in PetscOmpCtrlCreate()
233 PetscCallExternal(hwloc_bitmap_from_ulong, ctrl->omp_cpuset, cpu_ulongs[0]); in PetscOmpCtrlCreate()
235 hwloc_bitmap_from_ulong(ctrl->omp_cpuset, cpu_ulongs[0]); in PetscOmpCtrlCreate()
240 PetscCallExternal(hwloc_bitmap_set_ith_ulong, ctrl->omp_cpuset, (unsigned)i, cpu_ulongs[i]); in PetscOmpCtrlCreate()
242 hwloc_bitmap_set_ith_ulong(ctrl->omp_cpuset, (unsigned)i, cpu_ulongs[i]); in PetscOmpCtrlCreate()
248 *pctrl = ctrl; in PetscOmpCtrlCreate()
264 PetscOmpCtrl ctrl = *pctrl; in PetscOmpCtrlDestroy() local
267 hwloc_bitmap_free(ctrl->cpuset); in PetscOmpCtrlDestroy()
268 hwloc_topology_destroy(ctrl->topology); in PetscOmpCtrlDestroy()
269 PetscCall(PetscOmpCtrlDestroyBarrier(ctrl)); in PetscOmpCtrlDestroy()
270 PetscCallMPI(MPI_Comm_free(&ctrl->omp_comm)); in PetscOmpCtrlDestroy()
271 if (ctrl->is_omp_master) { in PetscOmpCtrlDestroy()
272 hwloc_bitmap_free(ctrl->omp_cpuset); in PetscOmpCtrlDestroy()
273 PetscCallMPI(MPI_Comm_free(&ctrl->omp_master_comm)); in PetscOmpCtrlDestroy()
275 PetscCall(PetscFree(ctrl)); in PetscOmpCtrlDestroy()
298 PetscErrorCode PetscOmpCtrlGetOmpComms(PetscOmpCtrl ctrl, MPI_Comm *omp_comm, MPI_Comm *omp_master_… in PetscOmpCtrlGetOmpComms() argument
301 if (omp_comm) *omp_comm = ctrl->omp_comm; in PetscOmpCtrlGetOmpComms()
302 if (omp_master_comm) *omp_master_comm = ctrl->omp_master_comm; in PetscOmpCtrlGetOmpComms()
303 if (is_omp_master) *is_omp_master = ctrl->is_omp_master; in PetscOmpCtrlGetOmpComms()
332 PetscErrorCode PetscOmpCtrlBarrier(PetscOmpCtrl ctrl) in PetscOmpCtrlBarrier() argument
337 err = pthread_barrier_wait(ctrl->barrier); in PetscOmpCtrlBarrier()
356 PetscErrorCode PetscOmpCtrlOmpRegionOnMasterBegin(PetscOmpCtrl ctrl) in PetscOmpCtrlOmpRegionOnMasterBegin() argument
359 PetscCallExternal(hwloc_set_cpubind, ctrl->topology, ctrl->omp_cpuset, HWLOC_CPUBIND_PROCESS); in PetscOmpCtrlOmpRegionOnMasterBegin()
360 omp_set_num_threads(ctrl->omp_comm_size); /* may override the OMP_NUM_THREAD env var */ in PetscOmpCtrlOmpRegionOnMasterBegin()
378 PetscErrorCode PetscOmpCtrlOmpRegionOnMasterEnd(PetscOmpCtrl ctrl) in PetscOmpCtrlOmpRegionOnMasterEnd() argument
381 PetscCallExternal(hwloc_set_cpubind, ctrl->topology, ctrl->cpuset, HWLOC_CPUBIND_PROCESS); in PetscOmpCtrlOmpRegionOnMasterEnd()