Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion deps/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion deps/Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
6 changes: 3 additions & 3 deletions deps/build_local.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand All @@ -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
Expand Down
5 changes: 4 additions & 1 deletion deps/generate_helpers.jl
Original file line number Diff line number Diff line change
@@ -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}[]
Expand Down
28 changes: 20 additions & 8 deletions deps/generate_interfaces.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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')

Expand All @@ -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}()
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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 ")
Expand All @@ -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))
Expand Down Expand Up @@ -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<sycl::half **>")
parameters = replace(parameters, "float _Complex **" => "reinterpret_cast<std::complex<float> **>")
parameters = replace(parameters, "double _Complex **" => "reinterpret_cast<std::complex<double> **>")
Expand All @@ -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
Expand Down
14 changes: 14 additions & 0 deletions deps/onemkl_prologue.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
14 changes: 14 additions & 0 deletions deps/onemkl_prologue.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
14 changes: 14 additions & 0 deletions deps/src/onemkl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
14 changes: 14 additions & 0 deletions deps/src/onemkl.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
37 changes: 30 additions & 7 deletions deps/src/sycl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<sycl::backend::ext_oneapi_level_zero>(driver);
*obj = new syclPlatform_st({sycl_platform});
return 0;
}
Expand All @@ -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<sycl::backend::ext_oneapi_level_zero>(device);
*obj = new syclDevice_st({sycl_device});
return 0;
}
Expand All @@ -35,9 +36,15 @@ extern "C" int syclContextCreate(syclContext_t *obj, syclDevice_t *devices,
std::vector<sycl::device> 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::backend::ext_oneapi_level_zero, sycl::context>
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::backend::ext_oneapi_level_zero>(
sycl_context_input);
*obj = new syclContext_st({sycl_context});
return 0;
}
Expand All @@ -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<sycl::backend::ext_oneapi_level_zero,
sycl::queue>{queue, device->val, sycl_ownership};

auto sycl_queue = sycl::make_queue<sycl::backend::ext_oneapi_level_zero>(
sycl_queue_input, context->val);
*obj = new syclQueue_st({sycl_queue});
return 0;
}
Expand All @@ -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<sycl::backend::ext_oneapi_level_zero,
sycl::event>{event, sycl_ownership};

auto sycl_event = sycl::make_event<sycl::backend::ext_oneapi_level_zero>(
sycl_event_input, context->val);
*obj = new syclEvent_st({sycl_event});
return 0;
}

extern "C" int syclEventDestroy(syclEvent_t obj) {
Expand Down