Skip to content

Commit fc225b0

Browse files
authored
Merge pull request #480 from JuliaGPU/oneapi-2025
Co-authored-by: Tim Besard <tim.besard@gmail.com>
2 parents c3041da + 3283c9e commit fc225b0

File tree

10 files changed

+115
-21
lines changed

10 files changed

+115
-21
lines changed

deps/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ target_link_libraries(oneapi_support
1919
# XXX: we don't want to link against this plugin, but otherwise the run-time
2020
# loader doesn't find it (since it's located in the non-global Conda
2121
# library directory, and we can't set LD_LIBRARY_PATH from within Julia).
22-
pi_level_zero
22+
ur_adapter_level_zero
2323
)
2424

2525
install(TARGETS oneapi_support

deps/Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ oneAPI_Level_Zero_Headers_jll = "f4bc562b-d309-54f8-9efb-476e56f0410d"
1212
oneAPI_Support_Headers_jll = "24f86df5-245d-5634-a4cc-32433d9800b3"
1313

1414
[compat]
15-
oneAPI_Support_Headers_jll = "=2024.2.0"
15+
oneAPI_Support_Headers_jll = "=2025.0.0"

deps/build_local.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ if !isfile(joinpath(conda_dir, "condarc-julia.yml"))
4545
touch(joinpath(conda_dir, "conda-meta", "history"))
4646
end
4747
Conda.add_channel("https://software.repos.intel.com/python/conda/", conda_dir)
48-
Conda.add(["dpcpp_linux-64=2024.2.0", "mkl-devel-dpcpp=2024.2.0"], conda_dir)
48+
Conda.add(["dpcpp_linux-64=2025.0.0", "mkl-devel-dpcpp=2025.0.0"], conda_dir)
4949

5050
Conda.list(conda_dir)
5151

@@ -58,11 +58,11 @@ withenv("PATH"=>"$(ENV["PATH"]):$(Conda.bin_dir(conda_dir))",
5858
cmake() do cmake_path
5959
ninja() do ninja_path
6060
run(```$cmake_path -DCMAKE_CXX_COMPILER="icpx"
61-
-DCMAKE_CXX_FLAGS="-fsycl -isystem $(conda_dir)/include -isystem $include_dir"
61+
-DCMAKE_CXX_FLAGS="-fsycl -isystem $(conda_dir)/include -isystem $include_dir -fdiagnostics-color=always"
6262
-DCMAKE_INSTALL_RPATH=$(Conda.lib_dir(conda_dir))
6363
-DCMAKE_INSTALL_PREFIX=$install_dir
6464
-GNinja -S $(@__DIR__) -B $build_dir```)
65-
run(`$ninja_path -C $(build_dir) install`)
65+
run(`$cmake_path --build $(build_dir) --target install`)
6666
end
6767
end
6868
end

deps/generate_helpers.jl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
non_parametric_routines = ["init_matrix_handle", "release_matrix_handle", "set_matrix_property",
22
"init_matmat_descr", "release_matmat_descr", "set_matmat_data", "get_matmat_data", "matmat",
3-
"omatcopy", "sort_matrix", "optimize_gemv", "optimize_trmv", "optimize_trsv", "optimize_trsm"]
3+
"omatcopy", "sort_matrix", "optimize_gemv", "optimize_trmv", "optimize_trsv", "optimize_trsm",
4+
"init_omatconvert_descr", "release_omatconvert_descr", "init_omatadd_descr", "release_omatadd_descr",
5+
"omatconvert_buffer_size", "omatconvert_analyze", "omatconvert_get_nnz", "omatconvert",
6+
"omatadd_buffer_size", "omatadd_analyze", "omatadd_get_nnz"]
47

58
function analyzer_template(library::String, cpp_headers::String, name_routine::String)
69
list_parameters = Vector{String}[]

deps/generate_interfaces.jl

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@ using oneAPI_Support_Headers_jll
22

33
include("generate_helpers.jl")
44

5-
blas = [joinpath(oneAPI_Support_Headers_jll.artifact_dir, "include", "oneapi", "mkl", "blas", "buffer_decls.hpp")]
6-
lapack = [joinpath(oneAPI_Support_Headers_jll.artifact_dir, "include", "oneapi", "mkl", "lapack", "lapack.hpp"),
7-
joinpath(oneAPI_Support_Headers_jll.artifact_dir, "include", "oneapi", "mkl", "lapack", "scratchpad.hpp")]
8-
sparse = [joinpath(oneAPI_Support_Headers_jll.artifact_dir, "include", "oneapi", "mkl", "spblas", "sparse_structures.hpp"),
9-
joinpath(oneAPI_Support_Headers_jll.artifact_dir, "include", "oneapi", "mkl", "spblas", "sparse_auxiliary.hpp"),
10-
joinpath(oneAPI_Support_Headers_jll.artifact_dir, "include", "oneapi", "mkl", "spblas", "sparse_operations.hpp")]
5+
include_dir = joinpath(oneAPI_Support_Headers_jll.artifact_dir, "include")
6+
blas = [joinpath(include_dir, "oneapi", "mkl", "blas", "buffer_decls.hpp")]
7+
lapack = [joinpath(include_dir, "oneapi", "mkl", "lapack", "lapack.hpp"),
8+
joinpath(include_dir, "oneapi", "mkl", "lapack", "scratchpad.hpp")]
9+
sparse = [joinpath(include_dir, "oneapi", "mkl", "spblas", "sparse_structures.hpp"),
10+
joinpath(include_dir, "oneapi", "mkl", "spblas", "sparse_auxiliary.hpp"),
11+
joinpath(include_dir, "oneapi", "mkl", "spblas", "sparse_operations.hpp")]
1112

1213
dict_version = Dict{Int, Char}(1 => 'S', 2 => 'D', 3 => 'C', 4 => 'Z')
1314

@@ -23,7 +24,8 @@ version_types_header = Dict{Char, String}('S' => "float",
2324

2425
comments = ["namespace", "#", "}", "/*", "*", "//", "[[", "ONEMKL_DECLARE_", "ONEMKL_INLINE_DECLARE"]
2526

26-
void_output = ["init_matrix_handle", "init_matmat_descr", "release_matmat_descr", "set_matmat_data", "get_matmat_data"]
27+
void_output = ["init_matrix_handle", "init_matmat_descr", "release_matmat_descr", "set_matmat_data",
28+
"get_matmat_data", "init_omatadd_descr", "init_omatconvert_desc"]
2729

2830
function generate_headers(library::String, filename::Vector{String}, output::String; pattern::String="")
2931
routines = Dict{String,Int}()
@@ -189,6 +191,8 @@ function generate_headers(library::String, filename::Vector{String}, output::Str
189191
header = replace(header, ",)" => ")")
190192
header = replace(header, " void" => "void")
191193
header = replace(header, " sycl::event" => "sycl::event")
194+
header = replace(header, "* const* " => "**")
195+
header = replace(header, "int64_t**" => "int64_t **")
192196

193197
ind1 = findfirst(' ', header)
194198
ind2 = findfirst('(', header)
@@ -245,6 +249,7 @@ function generate_headers(library::String, filename::Vector{String}, output::Str
245249
(version == 'C') && (header = replace(header, "std::complex " => "float _Complex "))
246250
(version == 'Z') && (header = replace(header, "std::complex " => "double _Complex "))
247251
end
252+
header = replace(header, "omatconvert (" => "omatconvert(")
248253
header = replace(header, "transpose " => "onemklTranspose ")
249254
header = replace(header, "uplo " => "onemklUplo ")
250255
header = replace(header, "diag " => "onemklDiag ")
@@ -255,6 +260,8 @@ function generate_headers(library::String, filename::Vector{String}, output::Str
255260
header = replace(header, "sparse::matrix_view_descr " => "onemklMatrixView ")
256261
header = replace(header, "matrix_view_descr " => "onemklMatrixView ")
257262
header = replace(header, "sparse::matmat_request " => "onemklMatmatRequest ")
263+
header = replace(header, "omatconvert_alg " => "onemklOmatconvertAlg ")
264+
header = replace(header, "omatadd_alg " => "onemklOmataddAlg ")
258265
header = replace(header, name_routine => "sparse_" * name_routine)
259266
end
260267
push!(signatures, (header, name_routine, version, type_routine, template))
@@ -381,6 +388,10 @@ function generate_cpp(library::String, filename::Vector{String}, output::String;
381388
parameters = replace(parameters, "matrix_handle_t " => "(oneapi::mkl::sparse::matrix_handle_t) ")
382389
parameters = replace(parameters, "matmat_descr_t *" => "(oneapi::mkl::sparse::matmat_descr_t*) ")
383390
parameters = replace(parameters, "matmat_descr_t " => "(oneapi::mkl::sparse::matmat_descr_t) ")
391+
parameters = replace(parameters, "omatadd_descr_t *" => "(oneapi::mkl::sparse::omatadd_descr_t*) ")
392+
parameters = replace(parameters, "omatadd_descr_t " => "(oneapi::mkl::sparse::omatadd_descr_t) ")
393+
parameters = replace(parameters, "omatconvert_descr_t *" => "(oneapi::mkl::sparse::omatconvert_descr_t*) ")
394+
parameters = replace(parameters, "omatconvert_descr_t " => "(oneapi::mkl::sparse::omatconvert_descr_t) ")
384395
parameters = replace(parameters, "short **" => "reinterpret_cast<sycl::half **>")
385396
parameters = replace(parameters, "float _Complex **" => "reinterpret_cast<std::complex<float> **>")
386397
parameters = replace(parameters, "double _Complex **" => "reinterpret_cast<std::complex<double> **>")
@@ -407,7 +418,8 @@ function generate_cpp(library::String, filename::Vector{String}, output::String;
407418

408419
for type in ("onemklTranspose", "onemklSide", "onemklUplo", "onemklDiag", "onemklGenerate",
409420
"onemklLayout", "onemklJob", "onemklJobsvd", "onemklCompz", "onemklRangev",
410-
"onemklIndex", "onemklProperty", "onemklMatrixView", "onemklMatmatRequest")
421+
"onemklIndex", "onemklProperty", "onemklMatrixView", "onemklMatmatRequest",
422+
"onemklOmatconvertAlg", "onemklOmataddAlg")
411423
parameters = replace(parameters, Regex("$type ([A-Za-z0-9_]+),") => SubstitutionString("convert(\\1),"))
412424
parameters = replace(parameters, Regex(", $type ([A-Za-z0-9_]+)") => SubstitutionString(", convert(\\1)"))
413425
end

deps/onemkl_prologue.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,20 @@ oneapi::mkl::sparse::matmat_request convert(onemklMatmatRequest val) {
266266
}
267267
}
268268

269+
oneapi::mkl::sparse::omatconvert_alg convert(onemklOmatconvertAlg val) {
270+
switch (val) {
271+
case ONEMKL_OMATCONVERT_DEFAULT_ALG:
272+
return oneapi::mkl::sparse::omatconvert_alg::default_alg;
273+
}
274+
}
275+
276+
oneapi::mkl::sparse::omatadd_alg convert(onemklOmataddAlg val) {
277+
switch (val) {
278+
case ONEMKL_OMATADD_DEFAULT_ALG:
279+
return oneapi::mkl::sparse::omatadd_alg::default_alg;
280+
}
281+
}
282+
269283
// gemm
270284
// https://spec.oneapi.io/versions/1.0-rev-1/elements/oneMKL/source/domains/blas/gemm.html
271285
class gemmBatchInfo {

deps/onemkl_prologue.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,12 +120,26 @@ typedef enum {
120120
ONEMKL_MATMAT_REQUEST_FINALIZE,
121121
} onemklMatmatRequest;
122122

123+
typedef enum {
124+
ONEMKL_OMATCONVERT_DEFAULT_ALG,
125+
} onemklOmatconvertAlg;
126+
127+
typedef enum {
128+
ONEMKL_OMATADD_DEFAULT_ALG,
129+
} onemklOmataddAlg;
130+
123131
struct matrix_handle;
124132
typedef struct matrix_handle *matrix_handle_t;
125133

126134
struct matmat_descr;
127135
typedef struct matmat_descr *matmat_descr_t;
128136

137+
struct omatconvert_descr;
138+
typedef struct omatconvert_descr *omatconvert_descr_t;
139+
140+
struct omatadd_descr;
141+
typedef struct omatadd_descr *omatadd_descr_t;
142+
129143
int onemklHgemm_batch(syclQueue_t device_queue, onemklTranspose transa,
130144
onemklTranspose transb, int64_t *m,
131145
int64_t *n, int64_t *k, uint16_t *alpha,

deps/src/onemkl.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,20 @@ oneapi::mkl::sparse::matmat_request convert(onemklMatmatRequest val) {
266266
}
267267
}
268268

269+
oneapi::mkl::sparse::omatconvert_alg convert(onemklOmatconvertAlg val) {
270+
switch (val) {
271+
case ONEMKL_OMATCONVERT_DEFAULT_ALG:
272+
return oneapi::mkl::sparse::omatconvert_alg::default_alg;
273+
}
274+
}
275+
276+
oneapi::mkl::sparse::omatadd_alg convert(onemklOmataddAlg val) {
277+
switch (val) {
278+
case ONEMKL_OMATADD_DEFAULT_ALG:
279+
return oneapi::mkl::sparse::omatadd_alg::default_alg;
280+
}
281+
}
282+
269283
// gemm
270284
// https://spec.oneapi.io/versions/1.0-rev-1/elements/oneMKL/source/domains/blas/gemm.html
271285
class gemmBatchInfo {

deps/src/onemkl.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,12 +120,26 @@ typedef enum {
120120
ONEMKL_MATMAT_REQUEST_FINALIZE,
121121
} onemklMatmatRequest;
122122

123+
typedef enum {
124+
ONEMKL_OMATCONVERT_DEFAULT_ALG,
125+
} onemklOmatconvertAlg;
126+
127+
typedef enum {
128+
ONEMKL_OMATADD_DEFAULT_ALG,
129+
} onemklOmataddAlg;
130+
123131
struct matrix_handle;
124132
typedef struct matrix_handle *matrix_handle_t;
125133

126134
struct matmat_descr;
127135
typedef struct matmat_descr *matmat_descr_t;
128136

137+
struct omatconvert_descr;
138+
typedef struct omatconvert_descr *omatconvert_descr_t;
139+
140+
struct omatadd_descr;
141+
typedef struct omatadd_descr *omatadd_descr_t;
142+
129143
int onemklHgemm_batch(syclQueue_t device_queue, onemklTranspose transa,
130144
onemklTranspose transb, int64_t *m,
131145
int64_t *n, int64_t *k, uint16_t *alpha,

deps/src/sycl.cpp

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66

77
extern "C" int syclPlatformCreate(syclPlatform_t *obj,
88
ze_driver_handle_t driver) {
9-
auto sycl_platform = sycl::ext::oneapi::level_zero::make_platform((pi_native_handle) driver);
9+
auto sycl_platform =
10+
sycl::make_platform<sycl::backend::ext_oneapi_level_zero>(driver);
1011
*obj = new syclPlatform_st({sycl_platform});
1112
return 0;
1213
}
@@ -19,7 +20,7 @@ extern "C" int syclPlatformDestroy(syclPlatform_t obj) {
1920
extern "C" int syclDeviceCreate(syclDevice_t *obj, syclPlatform_t platform,
2021
ze_device_handle_t device) {
2122
auto sycl_device =
22-
sycl::ext::oneapi::level_zero::make_device(platform->val, (pi_native_handle) device);
23+
sycl::make_device<sycl::backend::ext_oneapi_level_zero>(device);
2324
*obj = new syclDevice_st({sycl_device});
2425
return 0;
2526
}
@@ -35,9 +36,15 @@ extern "C" int syclContextCreate(syclContext_t *obj, syclDevice_t *devices,
3536
std::vector<sycl::device> sycl_devices(ndevices);
3637
for (size_t i = 0; i < ndevices; i++)
3738
sycl_devices[i] = devices[i]->val;
39+
auto sycl_ownership =
40+
keep_ownership ? sycl::ext::oneapi::level_zero::ownership::keep
41+
: sycl::ext::oneapi::level_zero::ownership::transfer;
42+
sycl::backend_input_t<sycl::backend::ext_oneapi_level_zero, sycl::context>
43+
sycl_context_input = {context, sycl_devices, sycl_ownership};
3844

3945
auto sycl_context =
40-
sycl::ext::oneapi::level_zero::make_context(sycl_devices, (pi_native_handle) context, keep_ownership);
46+
sycl::make_context<sycl::backend::ext_oneapi_level_zero>(
47+
sycl_context_input);
4148
*obj = new syclContext_st({sycl_context});
4249
return 0;
4350
}
@@ -51,7 +58,15 @@ extern "C" int syclQueueCreate(syclQueue_t *obj, syclContext_t context,
5158
syclDevice_t device,
5259
ze_command_queue_handle_t queue,
5360
int keep_ownership) {
54-
auto sycl_queue = sycl::ext::oneapi::level_zero::make_queue(context->val, device->val, (pi_native_handle) queue, false, keep_ownership, {});
61+
auto sycl_ownership =
62+
keep_ownership ? sycl::ext::oneapi::level_zero::ownership::keep
63+
: sycl::ext::oneapi::level_zero::ownership::transfer;
64+
auto sycl_queue_input =
65+
sycl::backend_input_t<sycl::backend::ext_oneapi_level_zero,
66+
sycl::queue>{queue, device->val, sycl_ownership};
67+
68+
auto sycl_queue = sycl::make_queue<sycl::backend::ext_oneapi_level_zero>(
69+
sycl_queue_input, context->val);
5570
*obj = new syclQueue_st({sycl_queue});
5671
return 0;
5772
}
@@ -63,9 +78,17 @@ extern "C" int syclQueueDestroy(syclQueue_t obj) {
6378

6479
extern "C" int syclEventCreate(syclEvent_t *obj, syclContext_t context,
6580
ze_event_handle_t event, int keep_ownership) {
66-
auto sycl_event = sycl::ext::oneapi::level_zero::make_event(context->val, (pi_native_handle) event, keep_ownership);
67-
*obj = new syclEvent_st({sycl_event});
68-
return 0;
81+
auto sycl_ownership =
82+
keep_ownership ? sycl::ext::oneapi::level_zero::ownership::keep
83+
: sycl::ext::oneapi::level_zero::ownership::transfer;
84+
auto sycl_event_input =
85+
sycl::backend_input_t<sycl::backend::ext_oneapi_level_zero,
86+
sycl::event>{event, sycl_ownership};
87+
88+
auto sycl_event = sycl::make_event<sycl::backend::ext_oneapi_level_zero>(
89+
sycl_event_input, context->val);
90+
*obj = new syclEvent_st({sycl_event});
91+
return 0;
6992
}
7093

7194
extern "C" int syclEventDestroy(syclEvent_t obj) {

0 commit comments

Comments
 (0)