aboutsummaryrefslogblamecommitdiffstats
path: root/pysmctrl/__init__.py
blob: 5dc6175125fca5f307006060b214bb7fae19e74a (plain) (tree)

















































































                                                                                                       
import ctypes, ctypes.util
import os

# If this is failing, make sure that the directory containing libsmctrl.so is
# in your LD_LIBRARY_PATH environment variable. You likely need something like:
# LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/playpen/jbakita/gpu_subdiv/libsmctrl/
libsmctrl_path = ctypes.util.find_library("libsmctrl")
if not libsmctrl_path:
    libsmctrl_path = __path__[0] + "/../libsmctrl.so"
libsmctrl = ctypes.CDLL(libsmctrl_path)

def get_gpc_info(device_num):
    """
    Obtain list of thread processing clusters (TPCs) enabled for each general
    processing cluster (GPC) in the specified GPU.

    Parameters
    ----------
    device_num : int
        Which device to obtain information for (starts as 0, order is defined
        by nvdebug module). May not match CUDA device numbering.

    Returns
    -------
    list of int64
        A list as long as the number of GPCs enabled, where each list entry is
        a bitmask. A bit set at index `i` indicates that TPC `i` is part of the
        GPC at that list index. Obtained via GPU register reads in `nvdebug`.
    """
    num_gpcs = ctypes.c_uint()
    tpc_masks = ctypes.pointer(ctypes.c_ulonglong())
    res = libsmctrl.libsmctrl_get_gpc_info(ctypes.byref(num_gpcs), ctypes.byref(tpc_masks), device_num)
    if res != 0:
        print("pysmctrl: Unable to call libsmctrl_get_gpc_info(). Raising error %d..."%res)
        raise OSError(res, os.strerror(res))
    return [tpc_masks[i] for i in range(num_gpcs.value)]

def get_tpc_info(device_num):
    """
    Obtain a count of the total number of thread processing clusters (TPCs)
    enabled on the specified GPU.

    Parameters
    ----------
    device_num : int
        Which device to obtain TPC count for (starts as 0, order is defined by
        `nvdebug` module). May not match CUDA device numbering.

    Returns
    -------
    int
        Count of enabled TPCs. Obtained via GPU register reads in `nvdebug`.
    """
    num_tpcs = ctypes.c_uint()
    res = libsmctrl.libsmctrl_get_tpc_info(ctypes.byref(num_tpcs), device_num)
    if res != 0:
        print("pysmctrl: Unable to call libsmctrl_get_tpc_info(). Raising error %d..."%res)
        raise OSError(res, os.strerror(res))
    return num_tpcs.value

def get_tpc_info_cuda(device_num):
    """
    Obtain a count of the total number of thread processing clusters (TPCs)
    enabled on the specified GPU.

    Parameters
    ----------
    device_num : int
        Which device to obtain TPC count for, as a CUDA device ID.

    Returns
    -------
    int
        Count of enabled TPCs. Obtained via calculations on data from CUDA.
    """
    num_tpcs = ctypes.c_uint()
    res = libsmctrl.libsmctrl_get_tpc_info_cuda(ctypes.byref(num_tpcs), device_num)
    if res != 0:
        print("pysmctrl: Unable to call libsmctrl_get_tpc_info_cuda(). Raising error %d..."%res)
        raise OSError(res, os.strerror(res))
    return num_tpcs.value