diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt index 616fb58c..88af6131 100644 --- a/deps/CMakeLists.txt +++ b/deps/CMakeLists.txt @@ -19,7 +19,7 @@ target_link_libraries(oneapi_support # XXX: we don't want to link against this plugin, but otherwise the run-time # loader doesn't find it (since it's located in the non-global Conda # library directory, and we can't set LD_LIBRARY_PATH from within Julia). - pi_level_zero + ur_adapter_level_zero ) install(TARGETS oneapi_support diff --git a/deps/Project.toml b/deps/Project.toml index 8ad8b0b7..040d84b1 100644 --- a/deps/Project.toml +++ b/deps/Project.toml @@ -12,4 +12,4 @@ oneAPI_Level_Zero_Headers_jll = "f4bc562b-d309-54f8-9efb-476e56f0410d" oneAPI_Support_Headers_jll = "24f86df5-245d-5634-a4cc-32433d9800b3" [compat] -oneAPI_Support_Headers_jll = "=2024.2.0" +oneAPI_Support_Headers_jll = "=2025.0.0" diff --git a/deps/build_local.jl b/deps/build_local.jl index 9fdafaf9..77d94b04 100644 --- a/deps/build_local.jl +++ b/deps/build_local.jl @@ -45,7 +45,7 @@ if !isfile(joinpath(conda_dir, "condarc-julia.yml")) touch(joinpath(conda_dir, "conda-meta", "history")) end Conda.add_channel("https://software.repos.intel.com/python/conda/", conda_dir) -Conda.add(["dpcpp_linux-64=2024.2.0", "mkl-devel-dpcpp=2024.2.0"], conda_dir) +Conda.add(["dpcpp_linux-64=2025.0.0", "mkl-devel-dpcpp=2025.0.0"], conda_dir) Conda.list(conda_dir) @@ -58,11 +58,11 @@ withenv("PATH"=>"$(ENV["PATH"]):$(Conda.bin_dir(conda_dir))", cmake() do cmake_path ninja() do ninja_path run(```$cmake_path -DCMAKE_CXX_COMPILER="icpx" - -DCMAKE_CXX_FLAGS="-fsycl -isystem $(conda_dir)/include -isystem $include_dir" + -DCMAKE_CXX_FLAGS="-fsycl -isystem $(conda_dir)/include -isystem $include_dir -fdiagnostics-color=always" -DCMAKE_INSTALL_RPATH=$(Conda.lib_dir(conda_dir)) -DCMAKE_INSTALL_PREFIX=$install_dir -GNinja -S $(@__DIR__) -B $build_dir```) - run(`$ninja_path -C $(build_dir) install`) + run(`$cmake_path --build $(build_dir) --target install`) end end end diff --git a/deps/generate_helpers.jl b/deps/generate_helpers.jl index 4cfedebf..f17d6786 100644 --- a/deps/generate_helpers.jl +++ b/deps/generate_helpers.jl @@ -1,6 +1,9 @@ non_parametric_routines = ["init_matrix_handle", "release_matrix_handle", "set_matrix_property", "init_matmat_descr", "release_matmat_descr", "set_matmat_data", "get_matmat_data", "matmat", -"omatcopy", "sort_matrix", "optimize_gemv", "optimize_trmv", "optimize_trsv", "optimize_trsm"] +"omatcopy", "sort_matrix", "optimize_gemv", "optimize_trmv", "optimize_trsv", "optimize_trsm", +"init_omatconvert_descr", "release_omatconvert_descr", "init_omatadd_descr", "release_omatadd_descr", +"omatconvert_buffer_size", "omatconvert_analyze", "omatconvert_get_nnz", "omatconvert", +"omatadd_buffer_size", "omatadd_analyze", "omatadd_get_nnz"] function analyzer_template(library::String, cpp_headers::String, name_routine::String) list_parameters = Vector{String}[] diff --git a/deps/generate_interfaces.jl b/deps/generate_interfaces.jl index 46e72450..7d3b8342 100644 --- a/deps/generate_interfaces.jl +++ b/deps/generate_interfaces.jl @@ -2,12 +2,13 @@ using oneAPI_Support_Headers_jll include("generate_helpers.jl") -blas = [joinpath(oneAPI_Support_Headers_jll.artifact_dir, "include", "oneapi", "mkl", "blas", "buffer_decls.hpp")] -lapack = [joinpath(oneAPI_Support_Headers_jll.artifact_dir, "include", "oneapi", "mkl", "lapack", "lapack.hpp"), - joinpath(oneAPI_Support_Headers_jll.artifact_dir, "include", "oneapi", "mkl", "lapack", "scratchpad.hpp")] -sparse = [joinpath(oneAPI_Support_Headers_jll.artifact_dir, "include", "oneapi", "mkl", "spblas", "sparse_structures.hpp"), - joinpath(oneAPI_Support_Headers_jll.artifact_dir, "include", "oneapi", "mkl", "spblas", "sparse_auxiliary.hpp"), - joinpath(oneAPI_Support_Headers_jll.artifact_dir, "include", "oneapi", "mkl", "spblas", "sparse_operations.hpp")] +include_dir = joinpath(oneAPI_Support_Headers_jll.artifact_dir, "include") +blas = [joinpath(include_dir, "oneapi", "mkl", "blas", "buffer_decls.hpp")] +lapack = [joinpath(include_dir, "oneapi", "mkl", "lapack", "lapack.hpp"), + joinpath(include_dir, "oneapi", "mkl", "lapack", "scratchpad.hpp")] +sparse = [joinpath(include_dir, "oneapi", "mkl", "spblas", "sparse_structures.hpp"), + joinpath(include_dir, "oneapi", "mkl", "spblas", "sparse_auxiliary.hpp"), + joinpath(include_dir, "oneapi", "mkl", "spblas", "sparse_operations.hpp")] dict_version = Dict{Int, Char}(1 => 'S', 2 => 'D', 3 => 'C', 4 => 'Z') @@ -23,7 +24,8 @@ version_types_header = Dict{Char, String}('S' => "float", comments = ["namespace", "#", "}", "/*", "*", "//", "[[", "ONEMKL_DECLARE_", "ONEMKL_INLINE_DECLARE"] -void_output = ["init_matrix_handle", "init_matmat_descr", "release_matmat_descr", "set_matmat_data", "get_matmat_data"] +void_output = ["init_matrix_handle", "init_matmat_descr", "release_matmat_descr", "set_matmat_data", + "get_matmat_data", "init_omatadd_descr", "init_omatconvert_desc"] function generate_headers(library::String, filename::Vector{String}, output::String; pattern::String="") routines = Dict{String,Int}() @@ -189,6 +191,8 @@ function generate_headers(library::String, filename::Vector{String}, output::Str header = replace(header, ",)" => ")") header = replace(header, " void" => "void") header = replace(header, " sycl::event" => "sycl::event") + header = replace(header, "* const* " => "**") + header = replace(header, "int64_t**" => "int64_t **") ind1 = findfirst(' ', header) ind2 = findfirst('(', header) @@ -245,6 +249,7 @@ function generate_headers(library::String, filename::Vector{String}, output::Str (version == 'C') && (header = replace(header, "std::complex " => "float _Complex ")) (version == 'Z') && (header = replace(header, "std::complex " => "double _Complex ")) end + header = replace(header, "omatconvert (" => "omatconvert(") header = replace(header, "transpose " => "onemklTranspose ") header = replace(header, "uplo " => "onemklUplo ") header = replace(header, "diag " => "onemklDiag ") @@ -255,6 +260,8 @@ function generate_headers(library::String, filename::Vector{String}, output::Str header = replace(header, "sparse::matrix_view_descr " => "onemklMatrixView ") header = replace(header, "matrix_view_descr " => "onemklMatrixView ") header = replace(header, "sparse::matmat_request " => "onemklMatmatRequest ") + header = replace(header, "omatconvert_alg " => "onemklOmatconvertAlg ") + header = replace(header, "omatadd_alg " => "onemklOmataddAlg ") header = replace(header, name_routine => "sparse_" * name_routine) end push!(signatures, (header, name_routine, version, type_routine, template)) @@ -381,6 +388,10 @@ function generate_cpp(library::String, filename::Vector{String}, output::String; parameters = replace(parameters, "matrix_handle_t " => "(oneapi::mkl::sparse::matrix_handle_t) ") parameters = replace(parameters, "matmat_descr_t *" => "(oneapi::mkl::sparse::matmat_descr_t*) ") parameters = replace(parameters, "matmat_descr_t " => "(oneapi::mkl::sparse::matmat_descr_t) ") + parameters = replace(parameters, "omatadd_descr_t *" => "(oneapi::mkl::sparse::omatadd_descr_t*) ") + parameters = replace(parameters, "omatadd_descr_t " => "(oneapi::mkl::sparse::omatadd_descr_t) ") + parameters = replace(parameters, "omatconvert_descr_t *" => "(oneapi::mkl::sparse::omatconvert_descr_t*) ") + parameters = replace(parameters, "omatconvert_descr_t " => "(oneapi::mkl::sparse::omatconvert_descr_t) ") parameters = replace(parameters, "short **" => "reinterpret_cast") parameters = replace(parameters, "float _Complex **" => "reinterpret_cast **>") parameters = replace(parameters, "double _Complex **" => "reinterpret_cast **>") @@ -407,7 +418,8 @@ function generate_cpp(library::String, filename::Vector{String}, output::String; for type in ("onemklTranspose", "onemklSide", "onemklUplo", "onemklDiag", "onemklGenerate", "onemklLayout", "onemklJob", "onemklJobsvd", "onemklCompz", "onemklRangev", - "onemklIndex", "onemklProperty", "onemklMatrixView", "onemklMatmatRequest") + "onemklIndex", "onemklProperty", "onemklMatrixView", "onemklMatmatRequest", + "onemklOmatconvertAlg", "onemklOmataddAlg") parameters = replace(parameters, Regex("$type ([A-Za-z0-9_]+),") => SubstitutionString("convert(\\1),")) parameters = replace(parameters, Regex(", $type ([A-Za-z0-9_]+)") => SubstitutionString(", convert(\\1)")) end diff --git a/deps/onemkl_prologue.cpp b/deps/onemkl_prologue.cpp index c5110a0b..dda6b2ed 100644 --- a/deps/onemkl_prologue.cpp +++ b/deps/onemkl_prologue.cpp @@ -266,6 +266,20 @@ oneapi::mkl::sparse::matmat_request convert(onemklMatmatRequest val) { } } +oneapi::mkl::sparse::omatconvert_alg convert(onemklOmatconvertAlg val) { + switch (val) { + case ONEMKL_OMATCONVERT_DEFAULT_ALG: + return oneapi::mkl::sparse::omatconvert_alg::default_alg; + } +} + +oneapi::mkl::sparse::omatadd_alg convert(onemklOmataddAlg val) { + switch (val) { + case ONEMKL_OMATADD_DEFAULT_ALG: + return oneapi::mkl::sparse::omatadd_alg::default_alg; + } +} + // gemm // https://spec.oneapi.io/versions/1.0-rev-1/elements/oneMKL/source/domains/blas/gemm.html class gemmBatchInfo { diff --git a/deps/onemkl_prologue.h b/deps/onemkl_prologue.h index afe9077a..207d9b4b 100644 --- a/deps/onemkl_prologue.h +++ b/deps/onemkl_prologue.h @@ -120,12 +120,26 @@ typedef enum { ONEMKL_MATMAT_REQUEST_FINALIZE, } onemklMatmatRequest; +typedef enum { + ONEMKL_OMATCONVERT_DEFAULT_ALG, +} onemklOmatconvertAlg; + +typedef enum { + ONEMKL_OMATADD_DEFAULT_ALG, +} onemklOmataddAlg; + struct matrix_handle; typedef struct matrix_handle *matrix_handle_t; struct matmat_descr; typedef struct matmat_descr *matmat_descr_t; +struct omatconvert_descr; +typedef struct omatconvert_descr *omatconvert_descr_t; + +struct omatadd_descr; +typedef struct omatadd_descr *omatadd_descr_t; + int onemklHgemm_batch(syclQueue_t device_queue, onemklTranspose transa, onemklTranspose transb, int64_t *m, int64_t *n, int64_t *k, uint16_t *alpha, diff --git a/deps/src/onemkl.cpp b/deps/src/onemkl.cpp index b2674e51..b62107f5 100644 --- a/deps/src/onemkl.cpp +++ b/deps/src/onemkl.cpp @@ -266,6 +266,20 @@ oneapi::mkl::sparse::matmat_request convert(onemklMatmatRequest val) { } } +oneapi::mkl::sparse::omatconvert_alg convert(onemklOmatconvertAlg val) { + switch (val) { + case ONEMKL_OMATCONVERT_DEFAULT_ALG: + return oneapi::mkl::sparse::omatconvert_alg::default_alg; + } +} + +oneapi::mkl::sparse::omatadd_alg convert(onemklOmataddAlg val) { + switch (val) { + case ONEMKL_OMATADD_DEFAULT_ALG: + return oneapi::mkl::sparse::omatadd_alg::default_alg; + } +} + // gemm // https://spec.oneapi.io/versions/1.0-rev-1/elements/oneMKL/source/domains/blas/gemm.html class gemmBatchInfo { diff --git a/deps/src/onemkl.h b/deps/src/onemkl.h index 3db81a30..4b86864c 100644 --- a/deps/src/onemkl.h +++ b/deps/src/onemkl.h @@ -120,12 +120,26 @@ typedef enum { ONEMKL_MATMAT_REQUEST_FINALIZE, } onemklMatmatRequest; +typedef enum { + ONEMKL_OMATCONVERT_DEFAULT_ALG, +} onemklOmatconvertAlg; + +typedef enum { + ONEMKL_OMATADD_DEFAULT_ALG, +} onemklOmataddAlg; + struct matrix_handle; typedef struct matrix_handle *matrix_handle_t; struct matmat_descr; typedef struct matmat_descr *matmat_descr_t; +struct omatconvert_descr; +typedef struct omatconvert_descr *omatconvert_descr_t; + +struct omatadd_descr; +typedef struct omatadd_descr *omatadd_descr_t; + int onemklHgemm_batch(syclQueue_t device_queue, onemklTranspose transa, onemklTranspose transb, int64_t *m, int64_t *n, int64_t *k, uint16_t *alpha, diff --git a/deps/src/sycl.cpp b/deps/src/sycl.cpp index fa901359..61973b0b 100644 --- a/deps/src/sycl.cpp +++ b/deps/src/sycl.cpp @@ -6,7 +6,8 @@ extern "C" int syclPlatformCreate(syclPlatform_t *obj, ze_driver_handle_t driver) { - auto sycl_platform = sycl::ext::oneapi::level_zero::make_platform((pi_native_handle) driver); + auto sycl_platform = + sycl::make_platform(driver); *obj = new syclPlatform_st({sycl_platform}); return 0; } @@ -19,7 +20,7 @@ extern "C" int syclPlatformDestroy(syclPlatform_t obj) { extern "C" int syclDeviceCreate(syclDevice_t *obj, syclPlatform_t platform, ze_device_handle_t device) { auto sycl_device = - sycl::ext::oneapi::level_zero::make_device(platform->val, (pi_native_handle) device); + sycl::make_device(device); *obj = new syclDevice_st({sycl_device}); return 0; } @@ -35,9 +36,15 @@ extern "C" int syclContextCreate(syclContext_t *obj, syclDevice_t *devices, std::vector sycl_devices(ndevices); for (size_t i = 0; i < ndevices; i++) sycl_devices[i] = devices[i]->val; + auto sycl_ownership = + keep_ownership ? sycl::ext::oneapi::level_zero::ownership::keep + : sycl::ext::oneapi::level_zero::ownership::transfer; + sycl::backend_input_t + sycl_context_input = {context, sycl_devices, sycl_ownership}; auto sycl_context = - sycl::ext::oneapi::level_zero::make_context(sycl_devices, (pi_native_handle) context, keep_ownership); + sycl::make_context( + sycl_context_input); *obj = new syclContext_st({sycl_context}); return 0; } @@ -51,7 +58,15 @@ extern "C" int syclQueueCreate(syclQueue_t *obj, syclContext_t context, syclDevice_t device, ze_command_queue_handle_t queue, int keep_ownership) { - auto sycl_queue = sycl::ext::oneapi::level_zero::make_queue(context->val, device->val, (pi_native_handle) queue, false, keep_ownership, {}); + auto sycl_ownership = + keep_ownership ? sycl::ext::oneapi::level_zero::ownership::keep + : sycl::ext::oneapi::level_zero::ownership::transfer; + auto sycl_queue_input = + sycl::backend_input_t{queue, device->val, sycl_ownership}; + + auto sycl_queue = sycl::make_queue( + sycl_queue_input, context->val); *obj = new syclQueue_st({sycl_queue}); return 0; } @@ -63,9 +78,17 @@ extern "C" int syclQueueDestroy(syclQueue_t obj) { extern "C" int syclEventCreate(syclEvent_t *obj, syclContext_t context, ze_event_handle_t event, int keep_ownership) { - auto sycl_event = sycl::ext::oneapi::level_zero::make_event(context->val, (pi_native_handle) event, keep_ownership); - *obj = new syclEvent_st({sycl_event}); - return 0; + auto sycl_ownership = + keep_ownership ? sycl::ext::oneapi::level_zero::ownership::keep + : sycl::ext::oneapi::level_zero::ownership::transfer; + auto sycl_event_input = + sycl::backend_input_t{event, sycl_ownership}; + + auto sycl_event = sycl::make_event( + sycl_event_input, context->val); + *obj = new syclEvent_st({sycl_event}); + return 0; } extern "C" int syclEventDestroy(syclEvent_t obj) {