Source code for graph_tool.openmp
#! /usr/bin/env python
# -*- coding: utf-8 -*-
#
# graph_tool -- a general graph manipulation python module
#
# Copyright (C) 2006-2024 Tiago de Paula Peixoto <tiago@skewed.de>
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU Lesser General Public License as published by the Free
# Software Foundation; either version 3 of the License, or (at your option) any
# later version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
# details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from contextlib import contextmanager
from .dl_import import *
dl_import("from . import libgraph_tool_core as libcore")
[docs]
def openmp_enabled():
"""Return ``True`` if OpenMP was enabled during compilation."""
return libcore.openmp_enabled()
_hooks = []
def _openmp_add_hook(hook):
_hooks.append(hook)
[docs]
def openmp_get_num_threads():
"""Return the number of OpenMP threads."""
return libcore.openmp_get_num_threads()
[docs]
def openmp_set_num_threads(n):
"""Set the number of OpenMP threads."""
libcore.openmp_set_num_threads(n)
for hook in _hooks:
hook()
[docs]
def openmp_get_schedule():
"""Return the runtime OpenMP schedule and chunk size. The schedule can by
any of: ``"static"``, ``"dynamic"``, ``"guided"``, ``"auto"``."""
return libcore.openmp_get_schedule()
[docs]
def openmp_set_schedule(schedule, chunk=0):
"""Set the runtime OpenMP schedule and chunk size. The schedule can by
any of: ``"static"``, ``"dynamic"``, ``"guided"``, ``"auto"``."""
return libcore.openmp_set_schedule(schedule, chunk)
[docs]
def openmp_get_thresh():
"""Return the minimum number of vertices necessary to enable parallelization."""
return libcore.openmp_get_thresh()
[docs]
def openmp_set_thresh(n):
"""Set the the minimum number of vertices necessary to enable parallelization."""
return libcore.openmp_set_thresh(n)
[docs]
@contextmanager
def openmp_context(nthreads=None, schedule=None, chunk=0, thresh=None):
"""Return a context manager that sets the tuntime OpenMP parameters, and
restores the original values when exited."""
nthreads_ = openmp_get_num_threads()
schedule_, chunk_ = openmp_get_schedule()
thres_ = openmp_get_thresh()
try:
if nthreads is not None:
openmp_set_num_threads(nthreads)
if schedule is not None:
openmp_set_schedule(schedule, chunk)
if thresh is not None:
openmp_set_thresh(thresh)
yield
finally:
openmp_set_num_threads(nthreads_)
openmp_set_schedule(schedule_, chunk_)
openmp_set_thresh(thres_)