From cda941718a60fb6ba873db6b3ff498ee3babed99 Mon Sep 17 00:00:00 2001 From: Oleksandr Pavlyk Date: Wed, 16 Feb 2022 12:37:30 -0600 Subject: [PATCH 1/3] Example of calling MKL on usm_ndarray inputs --- cmake/FindDpctl.cmake | 64 ++++++++ examples/pybind11/onemkl_gemv/CMakeLists.txt | 57 +++++++ examples/pybind11/onemkl_gemv/README.md | 13 ++ examples/pybind11/onemkl_gemv/setup.py | 10 ++ .../onemkl_gemv/sycl_gemm/__init__.py | 3 + .../onemkl_gemv/sycl_gemm/_onemkl.cpp | 142 ++++++++++++++++++ .../pybind11/onemkl_gemv/sycl_gemm/build.sh | 15 ++ .../pybind11/onemkl_gemv/tests/test_gemm.py | 21 +++ 8 files changed, 325 insertions(+) create mode 100644 cmake/FindDpctl.cmake create mode 100644 examples/pybind11/onemkl_gemv/CMakeLists.txt create mode 100644 examples/pybind11/onemkl_gemv/README.md create mode 100644 examples/pybind11/onemkl_gemv/setup.py create mode 100644 examples/pybind11/onemkl_gemv/sycl_gemm/__init__.py create mode 100644 examples/pybind11/onemkl_gemv/sycl_gemm/_onemkl.cpp create mode 100755 examples/pybind11/onemkl_gemv/sycl_gemm/build.sh create mode 100644 examples/pybind11/onemkl_gemv/tests/test_gemm.py diff --git a/cmake/FindDpctl.cmake b/cmake/FindDpctl.cmake new file mode 100644 index 0000000000..b7da924045 --- /dev/null +++ b/cmake/FindDpctl.cmake @@ -0,0 +1,64 @@ +#.rst: +# +# Find the include directory for ``dpctl_capi.h``, ``dpctl4pybind11.hpp``. +# +# This module sets the following variables: +# +# ``Dpctl_FOUND`` +# True if DPCTL was found. +# ``Dpctl_INCLUDE_DIRS`` +# The include directories needed to use Dpctl. +# ``Dpctl_VERSION`` +# The version of DPCTL found. +# +# The module will also explicitly define one cache variable: +# +# ``Dpctl_INCLUDE_DIR`` +# + +if(NOT Dpctl_FOUND) + set(_find_extra_args) + if(Dpctl_FIND_REQUIRED) + list(APPEND _find_extra_args REQUIRED) + endif() + if(Dpctl_FIND_QUIET) + list(APPEND _find_extra_args QUIET) + endif() + find_package(PythonInterp ${_find_extra_args}) + find_package(PythonLibs ${_find_extra_args}) + + if(PYTHON_EXECUTABLE) + execute_process(COMMAND "${PYTHON_EXECUTABLE}" + -c "import dpctl; print(dpctl.get_include())" + OUTPUT_VARIABLE _dpctl_include_dir + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET + ) + execute_process(COMMAND "${PYTHON_EXECUTABLE}" + -c "import dpctl; print(dpctl.__version__)" + OUTPUT_VARIABLE Dpctl_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET + ) + + endif() +endif() + +find_path(Dpctl_INCLUDE_DIR + dpctl_capi.h dpctl4pybind11.hpp dpctl_sycl_interface.h + PATHS "${_dpctl_include_dir}" "${PYTHON_INCLUDE_DIR}" + PATH_SUFFIXES dpctl/include + ) + +set(Dpctl_INCLUDE_DIRS ${Dpctl_INCLUDE_DIR}) + +# handle the QUIETLY and REQUIRED arguments and set Dpctl_FOUND to TRUE if +# all listed variables are TRUE +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Dpctl + REQUIRED_VARS + Dpctl_INCLUDE_DIR + VERSION_VAR Dpctl_VERSION + ) + +mark_as_advanced(Dpctl_INCLUDE_DIR) diff --git a/examples/pybind11/onemkl_gemv/CMakeLists.txt b/examples/pybind11/onemkl_gemv/CMakeLists.txt new file mode 100644 index 0000000000..00e7d7d45c --- /dev/null +++ b/examples/pybind11/onemkl_gemv/CMakeLists.txt @@ -0,0 +1,57 @@ +cmake_minimum_required(VERSION 3.22 FATAL_ERROR) + +project(example_use_mkl_gemm LANGUAGES CXX) +set(DPCTL_CMAKE_MODULES_PATH "${CMAKE_SOURCE_DIR}/../../../cmake") +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${DPCTL_CMAKE_MODULES_PATH}) +find_package(IntelDPCPP REQUIRED PATHS ${DPCTL_CMAKE_MODULES_PATH} NO_DEFAULT_PATH) + + +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}") +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED True) + +# Define CMAKE_INSTALL_xxx: LIBDIR, INCLUDEDIR +include(GNUInstallDirs) + +# Fetch pybind11 +include(FetchContent) +FetchContent_Declare( + pybind11 + URL https://github.com/pybind/pybind11/archive/refs/tags/v2.9.0.tar.gz + URL_HASH SHA256=057fb68dafd972bc13afb855f3b0d8cf0fa1a78ef053e815d9af79be7ff567cb +) +FetchContent_MakeAvailable(pybind11) + +find_package(PythonExtensions REQUIRED) +find_package(Dpctl REQUIRED) + +find_library(mkl_core NAMES mkl_core PATH ${MKL_LIBRARY_DIR}) +find_library(mkl_sycl NAMES mkl_sycl PATH ${MKL_LIBRARY_DIR}) +find_library(mkl_intel_ilp64 NAMES mkl_intel_ilp64 PATH ${MKL_LIBRARY_DIR}) +find_library(mkl_tbb_thread NAMES mkl_tbb_thread PATH ${MKL_LIBRARY_DIR}) +find_library(tbb NAMES tbb PATH ${TBB_LIBRARY_DIR}) + +set(py_module_name _onemkl) + +pybind11_add_module(${py_module_name} + MODULE + sycl_gemm/_onemkl.cpp +) +target_include_directories(${py_module_name} + PUBLIC ${MKL_INCLUDE_DIR} ${TBB_INCLUDE_DIR} +) +target_link_libraries(${py_module_name} + PUBLIC mkl_sycl mkl_intel_ilp64 mkl_tbb_thread mkl_core tbb +) + +install(TARGETS ${py_module_name} DESTINATION sycl_gemm) +target_include_directories(${py_module_name} PUBLIC ${Dpctl_INCLUDE_DIRS}) +target_link_directories(${py_module_name} PUBLIC ${MKL_LIBRARY_DIR} ${TBB_LIBRARY_DIR}) + +get_target_property(_sycl_gemm_sources ${py_module_name} SOURCES) +set_source_files_properties(${_sycl_gemm_sources} + PROPERTIES + COMPILE_OPTIONS "-O3;-Wno-deprecated-declarations" +) + +set(ignoreMe "${SKBUILD}") diff --git a/examples/pybind11/onemkl_gemv/README.md b/examples/pybind11/onemkl_gemv/README.md new file mode 100644 index 0000000000..9645a4dd92 --- /dev/null +++ b/examples/pybind11/onemkl_gemv/README.md @@ -0,0 +1,13 @@ +Example of SYCL built pybind11 extension + +To build, use (assumes scikit-build and dpcpp) is installed + +```sh +python setup.py develop -- -G "Ninja" -DCMAKE_C_COMPILER:PATH=icx -DCMAKE_CXX_COMPILER:PATH=icpx -DTBB_LIBRARY_DIR=$CONDA_PREFIX/lib -DMKL_LIBRARY_DIR=${CONDA_PREFIX}/lib -DMKL_INCLUDE_DIR=${CONDA_PREFIX}/include -DTBB_INCLUDE_DIR=${CONDA_PREFIX}/include +``` + +To run test suite + +```sh +python -m pytest tests +``` diff --git a/examples/pybind11/onemkl_gemv/setup.py b/examples/pybind11/onemkl_gemv/setup.py new file mode 100644 index 0000000000..dd00d8e1a9 --- /dev/null +++ b/examples/pybind11/onemkl_gemv/setup.py @@ -0,0 +1,10 @@ +from skbuild import setup + +setup( + name="sycl_gemm", + version="0.0.1", + description="an example of SYCL-powered Python package (with pybind11)", + author="Intel Scripting", + license="Apache 2.0", + packages=["sycl_gemm"], +) diff --git a/examples/pybind11/onemkl_gemv/sycl_gemm/__init__.py b/examples/pybind11/onemkl_gemv/sycl_gemm/__init__.py new file mode 100644 index 0000000000..07d7ec6ced --- /dev/null +++ b/examples/pybind11/onemkl_gemv/sycl_gemm/__init__.py @@ -0,0 +1,3 @@ +from ._onemkl import gemv + +__all__ = ["gemv"] diff --git a/examples/pybind11/onemkl_gemv/sycl_gemm/_onemkl.cpp b/examples/pybind11/onemkl_gemv/sycl_gemm/_onemkl.cpp new file mode 100644 index 0000000000..08c402d17d --- /dev/null +++ b/examples/pybind11/onemkl_gemv/sycl_gemm/_onemkl.cpp @@ -0,0 +1,142 @@ +#include "dpctl4pybind11.hpp" +#include +#include +#include +#include + +namespace py = pybind11; + +/* DPCTL C-API for usm_ndarray + UsmNDArray_GetData + UsmNDArray_GetNDim + UsmNDArray_GetShape + UsmNDArray_GetStrides + UsmNDArray_GetTypenum + UsmNDArray_GetFlags + UsmNDArray_GetQueueRef + */ + +sycl::event gemv(sycl::queue q, + py::object matrix, + py::object vector, + py::object result, + const std::vector &depends = {}) +{ + PyObject *m_src = matrix.ptr(); + if (!PyObject_TypeCheck(m_src, &PyUSMArrayType)) { + throw std::runtime_error("Matrix is not a dpctl.tensor.usm_ndarray"); + } + + PyObject *v_src = vector.ptr(); + if (!PyObject_TypeCheck(v_src, &PyUSMArrayType)) { + throw std::runtime_error("Vector is not a dpctl.tensor.usm_ndarray"); + } + + PyObject *r_src = result.ptr(); + if (!PyObject_TypeCheck(r_src, &PyUSMArrayType)) { + throw std::runtime_error("Result is not a dpctl.tensor.usm_ndarray"); + } + + PyUSMArrayObject *m_usm_ary = reinterpret_cast(m_src); + PyUSMArrayObject *v_usm_ary = reinterpret_cast(v_src); + PyUSMArrayObject *r_usm_ary = reinterpret_cast(r_src); + + if (UsmNDArray_GetNDim(m_usm_ary) != 2 || + UsmNDArray_GetNDim(v_usm_ary) != 1 || + UsmNDArray_GetNDim(r_usm_ary) != 1) + { + throw std::runtime_error( + "Inconsistent dimensions, expecting matrix and a vector"); + } + + py::ssize_t *m_sh = UsmNDArray_GetShape(m_usm_ary); + py::ssize_t n = m_sh[0]; + py::ssize_t m = m_sh[1]; + + py::ssize_t *v_sh = UsmNDArray_GetShape(v_usm_ary); + py::ssize_t *r_sh = UsmNDArray_GetShape(r_usm_ary); + if (v_sh[0] != m || r_sh[0] != n) { + throw std::runtime_error("Inconsistent shapes."); + } + + int mat_flags = UsmNDArray_GetFlags(m_usm_ary); + int v_flags = UsmNDArray_GetFlags(v_usm_ary); + int r_flags = UsmNDArray_GetFlags(r_usm_ary); + + if (!((mat_flags & (USM_ARRAY_C_CONTIGUOUS | USM_ARRAY_F_CONTIGUOUS)) && + (v_flags & (USM_ARRAY_C_CONTIGUOUS | USM_ARRAY_F_CONTIGUOUS)) && + (r_flags & (USM_ARRAY_C_CONTIGUOUS | USM_ARRAY_F_CONTIGUOUS)))) + { + throw std::runtime_error("Arrays must be contiguous."); + } + + int mat_typenum = UsmNDArray_GetTypenum(m_usm_ary); + int v_typenum = UsmNDArray_GetTypenum(v_usm_ary); + int r_typenum = UsmNDArray_GetTypenum(r_usm_ary); + + if ((mat_typenum != v_typenum) || (r_typenum != v_typenum) || + !((v_typenum == UAR_DOUBLE) || (v_typenum == UAR_FLOAT) || + (v_typenum == UAR_CDOUBLE) || (v_typenum == UAR_CFLOAT))) + { + std::cout << "Found: [" << mat_typenum << ", " << v_typenum << ", " + << r_typenum << "]" << std::endl; + std::cout << "Expected: [" << UAR_DOUBLE << ", " << UAR_FLOAT << ", " + << UAR_CDOUBLE << ", " << UAR_CFLOAT << "]" << std::endl; + throw std::runtime_error( + "Only real and complex floating point arrays are supported."); + } + + char *mat_typeless_ptr = UsmNDArray_GetData(m_usm_ary); + char *v_typeless_ptr = UsmNDArray_GetData(v_usm_ary); + char *r_typeless_ptr = UsmNDArray_GetData(r_usm_ary); + + sycl::event res_ev; + if (v_typenum == UAR_DOUBLE) { + using T = double; + sycl::event gemv_ev = oneapi::mkl::blas::row_major::gemv( + q, oneapi::mkl::transpose::nontrans, n, m, T(1), + reinterpret_cast(mat_typeless_ptr), m, + reinterpret_cast(v_typeless_ptr), 1, T(0), + reinterpret_cast(r_typeless_ptr), 1, depends); + res_ev = gemv_ev; + } + else if (v_typenum == UAR_FLOAT) { + using T = float; + sycl::event gemv_ev = oneapi::mkl::blas::row_major::gemv( + q, oneapi::mkl::transpose::nontrans, n, m, T(1), + reinterpret_cast(mat_typeless_ptr), m, + reinterpret_cast(v_typeless_ptr), 1, T(0), + reinterpret_cast(r_typeless_ptr), 1, depends); + res_ev = gemv_ev; + } + else if (v_typenum == UAR_CDOUBLE) { + using T = std::complex; + sycl::event gemv_ev = oneapi::mkl::blas::row_major::gemv( + q, oneapi::mkl::transpose::nontrans, n, m, T(1), + reinterpret_cast(mat_typeless_ptr), m, + reinterpret_cast(v_typeless_ptr), 1, T(0), + reinterpret_cast(r_typeless_ptr), 1, depends); + res_ev = gemv_ev; + } + else if (v_typenum == UAR_CFLOAT) { + using T = std::complex; + sycl::event gemv_ev = oneapi::mkl::blas::row_major::gemv( + q, oneapi::mkl::transpose::nontrans, n, m, T(1), + reinterpret_cast(mat_typeless_ptr), m, + reinterpret_cast(v_typeless_ptr), 1, T(0), + reinterpret_cast(r_typeless_ptr), 1, depends); + res_ev = gemv_ev; + } + else { + throw std::runtime_error("Type dispatch ran into trouble."); + } + + return res_ev; +} + +PYBIND11_MODULE(_onemkl, m) +{ + // Import the dpctl extensions + import_dpctl(); + m.def("gemv", &gemv, "Uses oneMKL to compute dot(matrix, vector)"); +} diff --git a/examples/pybind11/onemkl_gemv/sycl_gemm/build.sh b/examples/pybind11/onemkl_gemv/sycl_gemm/build.sh new file mode 100755 index 0000000000..221f484ae1 --- /dev/null +++ b/examples/pybind11/onemkl_gemv/sycl_gemm/build.sh @@ -0,0 +1,15 @@ +#!/bin/bash -x + +export PYBIND11_INCLUDES=$(python3 -m pybind11 --includes) +export DPCTL_INCLUDE_DIR=$(python -c "import dpctl; print(dpctl.get_include())") +export DPCTL_LIB_DIR=${DPCTL_INCLUDE_DIR}/.. +export PY_EXT_SUFFIX=$(python3-config --extension-suffix) +export HOST_COMPILER_FLAGS="-g -std=c++2a -O3 -Wno-return-type -Wno-deprecated-declarations -fPIC ${PYBIND11_INCLUDES} -I${DPCTL_INCLUDE_DIR}" + +# -fsycl-host-compiler=g++ \ +# -fsycl-host-compiler-options="${HOST_COMPILER_FLAGS}" \ + +dpcpp -O3 -fsycl -Wno-deprecated-declarations \ + -fpic -fPIC -shared \ + ${PYBIND11_INCLUDES} -I${DPCTL_INCLUDE_DIR} \ + sycl_gemm.cpp -o _sycl_gemm${PY_EXT_SUFFIX} diff --git a/examples/pybind11/onemkl_gemv/tests/test_gemm.py b/examples/pybind11/onemkl_gemv/tests/test_gemm.py new file mode 100644 index 0000000000..f97b5be05a --- /dev/null +++ b/examples/pybind11/onemkl_gemv/tests/test_gemm.py @@ -0,0 +1,21 @@ +import numpy as np +import pytest +from sycl_gemm import gemv + +import dpctl +import dpctl.tensor as dpt + + +def test_gemv(): + try: + q = dpctl.SyclQueue() + except dpctl.SyclQueueCreationError: + pytest.skip("Queue could not be created") + Mnp, vnp = np.random.randn(5, 3), np.random.randn(3) + r = dpt.empty((5,), dtype="d", sycl_queue=q) + M = dpt.asarray(Mnp, sycl_queue=q) + v = dpt.asarray(vnp, sycl_queue=q) + ev = gemv(M.sycl_queue, M, v, r, []) + ev.wait() + rnp = dpt.asnumpy(r) + assert np.allclose(rnp, Mnp @ vnp) From afc8821386ec325dd77604e3e931e48e80bb3f4c Mon Sep 17 00:00:00 2001 From: Oleksandr Pavlyk Date: Fri, 25 Feb 2022 10:04:37 -0600 Subject: [PATCH 2/3] gemv function returns a pair of events, first for host task, second for MKL computation --- .../onemkl_gemv/sycl_gemm/_onemkl.cpp | 44 ++++++++++++++++--- .../pybind11/onemkl_gemv/tests/test_gemm.py | 4 +- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/examples/pybind11/onemkl_gemv/sycl_gemm/_onemkl.cpp b/examples/pybind11/onemkl_gemv/sycl_gemm/_onemkl.cpp index 08c402d17d..822cceb3d7 100644 --- a/examples/pybind11/onemkl_gemv/sycl_gemm/_onemkl.cpp +++ b/examples/pybind11/onemkl_gemv/sycl_gemm/_onemkl.cpp @@ -16,11 +16,41 @@ namespace py = pybind11; UsmNDArray_GetQueueRef */ -sycl::event gemv(sycl::queue q, - py::object matrix, - py::object vector, - py::object result, - const std::vector &depends = {}) +sycl::event keep_args_alive(sycl::queue q, + py::object o1, + py::object o2, + py::object o3, + const std::vector &depends = {}) +{ + sycl::event ht_event = q.submit([&](sycl::handler &cgh) { + cgh.depends_on(depends); + std::shared_ptr shp1 = std::make_shared(o1); + std::shared_ptr shp2 = std::make_shared(o2); + std::shared_ptr shp3 = std::make_shared(o3); + shp1->inc_ref(); + shp2->inc_ref(); + shp3->inc_ref(); + cgh.host_task([=]() { + bool guard = (Py_IsInitialized() && !_Py_IsFinalizing()); + if (guard) { + PyGILState_STATE gstate; + gstate = PyGILState_Ensure(); + shp1->dec_ref(); + shp2->dec_ref(); + shp3->dec_ref(); + PyGILState_Release(gstate); + } + }); + }); + return ht_event; +} + +std::pair +gemv(sycl::queue q, + py::object matrix, + py::object vector, + py::object result, + const std::vector &depends = {}) { PyObject *m_src = matrix.ptr(); if (!PyObject_TypeCheck(m_src, &PyUSMArrayType)) { @@ -131,7 +161,9 @@ sycl::event gemv(sycl::queue q, throw std::runtime_error("Type dispatch ran into trouble."); } - return res_ev; + sycl::event ht_event = keep_args_alive(q, matrix, vector, result, {res_ev}); + + return std::make_pair(ht_event, res_ev); } PYBIND11_MODULE(_onemkl, m) diff --git a/examples/pybind11/onemkl_gemv/tests/test_gemm.py b/examples/pybind11/onemkl_gemv/tests/test_gemm.py index f97b5be05a..7a78fba346 100644 --- a/examples/pybind11/onemkl_gemv/tests/test_gemm.py +++ b/examples/pybind11/onemkl_gemv/tests/test_gemm.py @@ -15,7 +15,7 @@ def test_gemv(): r = dpt.empty((5,), dtype="d", sycl_queue=q) M = dpt.asarray(Mnp, sycl_queue=q) v = dpt.asarray(vnp, sycl_queue=q) - ev = gemv(M.sycl_queue, M, v, r, []) - ev.wait() + hev, ev = gemv(M.sycl_queue, M, v, r, []) + hev.wait() rnp = dpt.asnumpy(r) assert np.allclose(rnp, Mnp @ vnp) From 5f428fd428905dd2d7c4ecd340d2f654abe39ade Mon Sep 17 00:00:00 2001 From: Oleksandr Pavlyk Date: Thu, 17 Feb 2022 19:10:57 -0600 Subject: [PATCH 3/3] test_example job needs scikit-build --- .github/workflows/conda-package.yml | 58 ++++++++++++++++++++--------- 1 file changed, 40 insertions(+), 18 deletions(-) diff --git a/.github/workflows/conda-package.yml b/.github/workflows/conda-package.yml index 9e07dc8f69..764f1ee973 100644 --- a/.github/workflows/conda-package.yml +++ b/.github/workflows/conda-package.yml @@ -317,7 +317,7 @@ jobs: runs-on: ${{ matrix.runner }} strategy: matrix: - python: [3.8] + python: [3.9] experimental: [false] runner: [ubuntu-latest] continue-on-error: ${{ matrix.experimental }} @@ -363,39 +363,58 @@ jobs: restore-keys: | ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}- ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}- - - name: Install dpctl + - name: Install example requirements shell: bash -l {0} run: | + CHANNELS="${{ env.CHANNELS }}" source $CONDA/etc/profile.d/conda.sh - conda activate - CHANNELS="-c $GITHUB_WORKSPACE/channel ${{ env.CHANNELS }}" - conda install -y $PACKAGE_NAME pytest python=${{ matrix.python }} $CHANNELS - # Test installed packages - conda list - - name: Install example requirements + conda create -n examples -y pytest python=${{ matrix.python }} $CHANNELS + conda install -n examples -y cmake">=3.22" $CHANNELS || exit 1 + conda install -n examples -y ninja $CHANNELS || exit 1 + conda install -n examples -y pybind11 cython scikit-build $CHANNELS || exit 1 + conda install -n examples -y mkl-dpcpp mkl-devel-dpcpp dpcpp_cpp_rt $CHANNELS || exit 1 + conda create -y -n build_env -c intel dpcpp_linux-64 + - name: Install dpctl shell: bash -l {0} run: | source $CONDA/etc/profile.d/conda.sh - conda install -y pybind11 cython - conda install -y -c intel mkl-dpcpp mkl-devel-dpcpp numba-dppy - conda create -y -n build_env -c intel dpcpp_linux-64 + conda activate + CHANNELS="-c $GITHUB_WORKSPACE/channel -c dppy/label/dev -c intel --override-channels" + conda install -n examples -y $CHANNELS numba-dppy numpy dpctl || exit 1 - name: Build and run examples with native extensions shell: bash -l {0} run: | source $CONDA/etc/profile.d/conda.sh export OCL_ICD_FILENAMES=libintelocl.so export SYCL_ENABLE_HOST_DEVICE=1 - conda activate + conda activate examples + conda list cd examples/pybind11 - export CC=dpcpp - export CXX=dpcpp for d in $(ls) do pushd $d + export MKLROOT=${CONDA_PREFIX} + export TBBROOT=${CONDA_PREFIX} conda activate --stack build_env - python setup.py build_ext --inplace || exit 1 + if [ -e CMakeLists.txt ] + then + python setup.py build_ext --inplace -- -G Ninja \ + -DCMAKE_C_COMPILER:PATH=icx -DCMAKE_CXX_COMPILER:PATH=icpx \ + -DTBB_LIBRARY_DIR=${TBBROOT}/lib \ + -DMKL_LIBRARY_DIR=${MKLROOT}/lib \ + -DMKL_INCLUDE_DIR=${MKLROOT}/include \ + -DTBB_INCLUDE_DIR=${TBBROOT}/include || exit 1 + else + CC=dpcpp CXX=dpcpp LD_SHARED="dpcpp -shared" \ + python setup.py build_ext --inplace || exit 1 + fi conda deactivate - python example.py + if [ -e tests ] + then + LD_LIBRARY_PATH=${CONDA_PREFIX}/lib python -m pytest tests || exit 1 + else + LD_LIBRARY_PATH=${CONDA_PREFIX}/lib python example.py || exit 1 + fi popd done cd ../cython @@ -403,17 +422,20 @@ jobs: do pushd $d conda activate --stack build_env - python setup.py build_ext --inplace || exit 1 + CC=dpcpp CXX=dpcpp LD_SHARED="dpcpp -shared" \ + python setup.py build_ext --inplace || exit 1 conda deactivate - python run.py + LD_LIBRARY_PATH=${CONDA_PREFIX}/lib python run.py || exit 1 popd done - name: Run Python examples shell: bash -l {0} run: | cd examples/python + source $CONDA/etc/profile.d/conda.sh export OCL_ICD_FILENAMES=libintelocl.so export SYCL_ENABLE_HOST_DEVICE=1 + conda activate examples for script in $(find . \( -not -name "_*" -and -name "*.py" \)) do echo "Executing ${script}"