Exemple #1
0
def get_threads(config):
    """
    Create a list of thread creators, based on command line options and their availability.
    """
    # if we import it in the header, it messes up with coverage results
    from reikna.cluda import find_devices

    apis, _ = get_apis(config)

    tps = []
    for api in apis:
        devices = find_devices(
            api,
            include_devices=config.option.device_include_mask,
            exclude_devices=config.option.device_exclude_mask,
            include_platforms=config.option.platform_include_mask,
            exclude_platforms=config.option.platform_exclude_mask,
            include_duplicate_devices=config.option.include_duplicate_devices)

        for pnum in sorted(devices.keys()):
            dnums = sorted(devices[pnum])
            for dnum in dnums:
                tps.append(ThreadParams(api, pnum, dnum))

    return tps, [str(tp) for tp in tps]
Exemple #2
0
def get_threads(config):
    """
    Create a list of thread creators, based on command line options and their availability.
    """
    # if we import it in the header, it messes up with coverage results
    from reikna.cluda import find_devices

    apis, _ = get_apis(config)

    tps = []
    for api in apis:
        devices = find_devices(
            api,
            include_devices=config.option.device_include_mask,
            exclude_devices=config.option.device_exclude_mask,
            include_platforms=config.option.platform_include_mask,
            exclude_platforms=config.option.platform_exclude_mask,
            include_duplicate_devices=config.option.include_duplicate_devices)

        for pnum in sorted(devices.keys()):
            dnums = sorted(devices[pnum])
            for dnum in dnums:
                tps.append(ThreadParams(api, pnum, dnum))

    return tps, [str(tp) for tp in tps]
Exemple #3
0
def find_devices(api=None,
                 include_devices=None,
                 exclude_devices=None,
                 include_platforms=None,
                 exclude_platforms=None):
    """
    Returns a list of computation device identifiers for the given API and selection criteria.
    If there are several platforms with suitable devices, only the first one will be used
    (so if you need a specific platform, use the corresponding masks).

    :param api: the GPGPU backend to use, one of ``None``, ``"CUDA"`` and ``"OpenCL"``.
        If ``None`` is given, an arbitrary available backend will be chosen.
    :param include_devices: a list of strings; only devices with one of the strings
        present in the name will be included.
    :param exclude_devices: a list of strings; devices with one of the strings
        present in the name will be excluded.
    :param include_platforms: a list of strings; only platforms with one of the strings
        present in the name will be included.
    :param exclude_platforms: a list of strings; platforms with one of the strings
        present in the name will be excluded.
    :returns: a list of :py:class:`~nufhe.api_high_level.DeviceID` objects.
    """

    api_obj = _get_api_object(api)

    platforms_and_devices = cluda.find_devices(
        api_obj,
        include_devices=include_devices,
        exclude_devices=exclude_devices,
        include_platforms=include_platforms,
        exclude_platforms=exclude_platforms)

    if len(platforms_and_devices) == 0:
        raise ValueError(
            "No devices found satisfying the given search criteria")

    platform_ids = list(platforms_and_devices)

    return [
        DeviceID(api_obj.get_id(), platform_ids[0], device_id)
        for device_id in platforms_and_devices[platform_ids[0]]
    ]
Exemple #4
0
def pytest_generate_tests(metafunc):

    config = metafunc.config

    if 'thread' in metafunc.fixturenames:

        api_opt = config.option.api
        api_ids = supported_api_ids() if api_opt == 'supported' else [api_opt]

        vals = []
        ids = []
        for api_id in api_ids:
            api = get_api(api_id)
            devices = find_devices(
                api,
                include_devices=config.option.device_include_mask,
                include_duplicate_devices=config.option.
                include_duplicate_devices)
            for pnum in sorted(devices.keys()):
                dnums = sorted(devices[pnum])
                for dnum in dnums:
                    vals.append((api_id, pnum, dnum))
                    ids.append("{api_id}:{pnum}:{dnum}".format(api_id=api_id,
                                                               pnum=pnum,
                                                               dnum=dnum))

        if len(vals) == 0:
            raise RuntimeError(
                "Neither PyCUDA nor PyOpenCL could find any suitable devices. "
                "Check your system configuration.")

        metafunc.parametrize("thread", vals, ids=ids, indirect=True)

    if 'transform_type' in metafunc.fixturenames:

        if config.option.transform == 'all':
            vals = ['NTT', 'FFT']
        else:
            vals = [config.option.transform]

        metafunc.parametrize("transform_type", vals)
Exemple #5
0
def pytest_generate_tests(metafunc):

    config = metafunc.config

    if 'thread' in metafunc.fixturenames:

        api_opt = config.option.api
        api_ids = supported_api_ids() if api_opt == 'supported' else [api_opt]

        vals = []
        ids = []
        for api_id in api_ids:
            api = get_api(api_id)
            devices = find_devices(
                api,
                include_devices=config.option.device_include_mask,
                include_duplicate_devices=config.option.
                include_duplicate_devices)
            for pnum in sorted(devices.keys()):
                dnums = sorted(devices[pnum])
                for dnum in dnums:
                    vals.append((api_id, pnum, dnum))
                    ids.append("{api_id}:{pnum}:{dnum}".format(api_id=api_id,
                                                               pnum=pnum,
                                                               dnum=dnum))

        metafunc.parametrize("thread", vals, ids=ids, indirect=True)

    if 'transform_type' in metafunc.fixturenames:

        if config.option.transform == 'all':
            vals = ['NTT', 'FFT']
        else:
            vals = [config.option.transform]

        metafunc.parametrize("transform_type", vals)
Exemple #6
0
    def create(cls, interactive=False, device_filters=None, **thread_kwds):
        """
        Creates a new ``Thread`` object with its own context and queue inside.
        Intended for cases when you want to base your whole program on CLUDA.

        :param interactive: ask a user to choose a platform and a device from the ones found.
            If there is only one platform/device available, they will be chosen automatically.
        :param device_filters: keywords to filter devices
            (see the keywords for :py:func:`~reikna.cluda.find_devices`).
        :param thread_kwds: keywords to pass to :py:class:`Thread` constructor.
        :param kwds: same as in :py:class:`Thread`.
        """

        if device_filters is None:
            device_filters = {}
        devices = find_devices(cls.api, **device_filters)

        platforms = cls.api.get_platforms()

        if interactive:
            pnums = sorted(devices.keys())
            if len(pnums) == 1:
                selected_pnum = pnums[0]
                print("Platform:", platforms[0].name)
            else:
                print("Platforms:")
                default_pnum = pnums[0]
                for pnum in pnums:
                    print("[{pnum}]: {pname}".format(pnum=pnum, pname=platforms[pnum].name))
                print(
                    "Choose the platform [{default_pnum}]:".format(default_pnum=default_pnum),
                    end='')
                selected_pnum = _input()
                if selected_pnum == '':
                    selected_pnum = default_pnum
                else:
                    selected_pnum = int(selected_pnum)

            platform = platforms[selected_pnum]
            dnums = sorted(devices[selected_pnum])
            if len(dnums) == 1:
                selected_dnum = dnums[0]
                print("Device:", platform.get_devices()[0].name)
            else:
                print("Devices:")
                default_dnum = dnums[0]
                for dnum in dnums:
                    print("[{dnum}]: {dname}".format(
                        dnum=dnum, dname=platform.get_devices()[dnum].name))
                print(
                    "Choose the device [{default_dnum}]:".format(default_dnum=default_dnum),
                    end='')
                selected_dnum = _input()
                if selected_dnum == '':
                    selected_dnum = default_dnum
                else:
                    selected_dnum = int(selected_dnum)

        else:
            selected_pnum = sorted(devices.keys())[0]
            selected_dnum = devices[selected_pnum][0]

        if thread_kwds is None:
            thread_kwds = {}
        return cls(platforms[selected_pnum].get_devices()[selected_dnum], **thread_kwds)
Exemple #7
0
    def create(cls, interactive=False, device_filters=None, **thread_kwds):
        """
        Creates a new ``Thread`` object with its own context and queue inside.
        Intended for cases when you want to base your whole program on CLUDA.

        :param interactive: ask a user to choose a platform and a device from the ones found.
            If there is only one platform/device available, they will be chosen automatically.
        :param device_filters: keywords to filter devices
            (see the keywords for :py:func:`~reikna.cluda.find_devices`).
        :param thread_kwds: keywords to pass to :py:class:`Thread` constructor.
        :param kwds: same as in :py:class:`Thread`.
        """

        if device_filters is None:
            device_filters = {}
        devices = find_devices(cls.api, **device_filters)

        platforms = cls.api.get_platforms()

        if interactive:
            pnums = sorted(devices.keys())
            if len(pnums) == 1:
                selected_pnum = pnums[0]
                print("Platform:", platforms[0].name)
            else:
                print("Platforms:")
                default_pnum = pnums[0]
                for pnum in pnums:
                    print("[{pnum}]: {pname}".format(
                        pnum=pnum, pname=platforms[pnum].name))
                print("Choose the platform [{default_pnum}]:".format(
                    default_pnum=default_pnum),
                      end='')
                selected_pnum = _input()
                if selected_pnum == '':
                    selected_pnum = default_pnum
                else:
                    selected_pnum = int(selected_pnum)

            platform = platforms[selected_pnum]
            dnums = sorted(devices[selected_pnum])
            if len(dnums) == 1:
                selected_dnum = dnums[0]
                print("Device:", platform.get_devices()[selected_dnum].name)
            else:
                print("Devices:")
                default_dnum = dnums[0]
                for dnum in dnums:
                    print("[{dnum}]: {dname}".format(
                        dnum=dnum, dname=platform.get_devices()[dnum].name))
                print("Choose the device [{default_dnum}]:".format(
                    default_dnum=default_dnum),
                      end='')
                selected_dnum = _input()
                if selected_dnum == '':
                    selected_dnum = default_dnum
                else:
                    selected_dnum = int(selected_dnum)

        else:
            selected_pnum = sorted(devices.keys())[0]
            selected_dnum = devices[selected_pnum][0]

        if thread_kwds is None:
            thread_kwds = {}
        return cls(platforms[selected_pnum].get_devices()[selected_dnum],
                   **thread_kwds)