From bee45c380d0c603809a4813ec1c4cac6967a8fca Mon Sep 17 00:00:00 2001 From: Lorenc Bushi Date: Thu, 18 Jan 2024 16:15:54 -0800 Subject: [PATCH 01/20] Throw when USM not supported by Device --- sycl/source/detail/usm/usm_impl.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sycl/source/detail/usm/usm_impl.cpp b/sycl/source/detail/usm/usm_impl.cpp index 396750acf3044..4260bb8569b07 100644 --- a/sycl/source/detail/usm/usm_impl.cpp +++ b/sycl/source/detail/usm/usm_impl.cpp @@ -252,6 +252,11 @@ void *alignedAlloc(size_t Alignment, size_t Size, const context &Ctxt, PrepareNotify.scopedNotify( (uint16_t)xpti::trace_point_type_t::mem_alloc_begin); #endif + if (Kind == alloc::device && + !Dev.has(sycl::aspect::usm_device_allocations)) { + throw sycl::exception(sycl::errc::feature_not_supported, + "Device does not support Unified Shared Memory!"); + } void *RetVal = alignedAllocInternal(Alignment, Size, getSyclObjImpl(Ctxt).get(), getSyclObjImpl(Dev).get(), Kind, PropList); From 3451e03ae3f1ec663ba43d87c7363566302f4840 Mon Sep 17 00:00:00 2001 From: Lorenc Bushi Date: Mon, 29 Jan 2024 08:39:07 -0800 Subject: [PATCH 02/20] Throw when malloc_chared not supported --- sycl/source/detail/usm/usm_impl.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/sycl/source/detail/usm/usm_impl.cpp b/sycl/source/detail/usm/usm_impl.cpp index 965a4f47f57c7..dd065a5434e25 100755 --- a/sycl/source/detail/usm/usm_impl.cpp +++ b/sycl/source/detail/usm/usm_impl.cpp @@ -146,11 +146,8 @@ void *alignedAllocInternal(size_t Alignment, size_t Size, } if (Kind == alloc::shared && !DevImpl->has(sycl::aspect::usm_shared_allocations)) { - // TODO:: Throw an exception to conform with the specification. - // Note that many tests will have to be changed to conform with the spec - // before completing this. That is, the tests will now have to expect - // exceptions as a result of failed allocations in addition to nullptr - // being returned depending on the reason why allocation failed. + throw sycl::exception(sycl::errc::feature_not_supported, + "Device does not support USM shared allocations!"); } void *RetVal = nullptr; if (Size == 0) From d48af00f67c9b98a4f19d4c61f51414ca5602e44 Mon Sep 17 00:00:00 2001 From: Lorenc Bushi Date: Mon, 29 Jan 2024 08:42:23 -0800 Subject: [PATCH 03/20] Throw when malloc_chared not supported --- sycl/source/detail/usm/usm_impl.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/sycl/source/detail/usm/usm_impl.cpp b/sycl/source/detail/usm/usm_impl.cpp index dd065a5434e25..d14d039d32ae9 100755 --- a/sycl/source/detail/usm/usm_impl.cpp +++ b/sycl/source/detail/usm/usm_impl.cpp @@ -270,11 +270,6 @@ void *alignedAlloc(size_t Alignment, size_t Size, const context &Ctxt, PrepareNotify.scopedNotify( (uint16_t)xpti::trace_point_type_t::mem_alloc_begin); #endif - if (Kind == alloc::device && - !Dev.has(sycl::aspect::usm_device_allocations)) { - throw sycl::exception(sycl::errc::feature_not_supported, - "Device does not support Unified Shared Memory!"); - } void *RetVal = alignedAllocInternal(Alignment, Size, getSyclObjImpl(Ctxt).get(), getSyclObjImpl(Dev).get(), Kind, PropList); From b04b160c6a239001d54c4485c22eaffb07725f6f Mon Sep 17 00:00:00 2001 From: Lorenc Bushi Date: Mon, 29 Jan 2024 11:38:38 -0800 Subject: [PATCH 04/20] Catch malloc_shared exceptions --- .../Annotated_arg_ptr/annotated_arg.cpp | 63 ++++++++++++++----- 1 file changed, 49 insertions(+), 14 deletions(-) diff --git a/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp b/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp index 8fad623752873..b86abddc0790a 100644 --- a/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp +++ b/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp @@ -75,22 +75,40 @@ MyStruct operator<<(const MyStruct &lhs, const MyStruct &rhs) { int main() { queue Q; - + try { auto *a = malloc_shared(8, Q); +} + catch (const sycl::exception&) { + a = nullptr; + } auto a_ptr = annotated_arg{a}; for (int i = 0; i < 8; i++) a_ptr[i] = i; - + try { auto *b = malloc_shared(4, Q); +} + catch (sycl::exception&) { + b = nullptr; + } auto b_ptr = annotated_arg{b}; - + try { auto *c = malloc_shared(1, Q); - c->b = malloc_shared(1, Q); - auto c_ptr = annotated_arg{c}; + } +catch (sycl::exception&) { + c = nullptr; +} +try { +c->b = malloc_shared(1, Q); +} + catch(sycl::exception&) { +c->b = nullptr;} + auto c_ptr = annotated_arg{c}; c_ptr->a = 0; c_ptr->b[0] = 0; - +try { auto *d = malloc_shared(4, Q); +} +catch (sycl::exception&) {d = nullptr;} auto d_ptr = annotated_arg{d}; for (int i = 0; i < 4; i++) d_ptr[i] = i; @@ -100,27 +118,44 @@ int main() { annotated_arg> f = MyStruct(6); annotated_arg> g = MyStruct(3); annotated_arg> h = MyStruct(2); - + try { auto *r1 = malloc_shared>(5, Q); +} +catch (sycl::exception&) { +r1 = nullptr; +} +try { auto *r2 = malloc_shared>(5, Q); - auto *r3 = malloc_shared>(5, Q); +} +catch (sycl::exception&) { +r2 = nullptr; +} + try { auto *r3 = malloc_shared>(5, Q);} +catch (sycl::exception&) {r3 = nullptr;} // testing logical overloaded operators annotated_arg> m = MyStruct(true); annotated_arg> n = MyStruct(false); - auto *r4 = malloc_shared>(3, Q); - auto *r5 = malloc_shared>(3, Q); - auto *r6 = malloc_shared>(3, Q); + try {auto *r4 = malloc_shared>(3, Q);} +catch (sycl::exception&) {r4 = nullptr;} + try {auto *r5 = malloc_shared>(3, Q);} +catch (sycl::exception&) {r5 = nullptr;} + try {auto *r6 = malloc_shared>(3, Q);} + catch (sycl::exception&) {r6 = nullptr;} // testing bit shift overloaded operators annotated_arg> x = MyStruct(1); annotated_arg> y = MyStruct(2); annotated_arg> z = MyStruct(4); - auto *r7 = malloc_shared>(2, Q); - auto *r8 = malloc_shared>(2, Q); - auto *r9 = malloc_shared>(2, Q); + try {auto *r7 = malloc_shared>(2, Q);} +catch (sycl::exception&) { r7 = nullptr; +} + try { auto *r8 = malloc_shared>(2, Q);} +catch (sycl::exception&) { r8 = nullptr;} + try {auto *r9 = malloc_shared>(2, Q);} +catch (sycl::exception&) { r9 = nullptr;} Q.single_task([=]() { a_ptr[0] += 1; From eb25955afcdcbab79b7b4e0faa2ab9dd5672a507 Mon Sep 17 00:00:00 2001 From: Lorenc Bushi Date: Mon, 29 Jan 2024 15:16:11 -0800 Subject: [PATCH 05/20] Add try/catch clauses --- .../Annotated_arg_ptr/annotated_arg.cpp | 83 ++++++++++--------- 1 file changed, 45 insertions(+), 38 deletions(-) diff --git a/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp b/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp index b86abddc0790a..d241406a319d2 100644 --- a/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp +++ b/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp @@ -75,40 +75,37 @@ MyStruct operator<<(const MyStruct &lhs, const MyStruct &rhs) { int main() { queue Q; - try { + +try { auto *a = malloc_shared(8, Q); } - catch (const sycl::exception&) { - a = nullptr; - } +catch (sycl::exception&) { a = nullptr; } auto a_ptr = annotated_arg{a}; for (int i = 0; i < 8; i++) a_ptr[i] = i; - try { + +try { auto *b = malloc_shared(4, Q); } - catch (sycl::exception&) { - b = nullptr; - } +catch (sycl::exception&) { b = nullptr; } auto b_ptr = annotated_arg{b}; - try { + +try { auto *c = malloc_shared(1, Q); - } -catch (sycl::exception&) { - c = nullptr; } -try { -c->b = malloc_shared(1, Q); +catch (sycl::exception&) { c = nullptr; } +try { + c->b = malloc_shared(1, Q); } - catch(sycl::exception&) { -c->b = nullptr;} - auto c_ptr = annotated_arg{c}; +catch (sycl::exception&) { c->b = nullptr; } + auto c_ptr = annotated_arg{c}; c_ptr->a = 0; c_ptr->b[0] = 0; + try { auto *d = malloc_shared(4, Q); } -catch (sycl::exception&) {d = nullptr;} +catch (sycl::exception&) { d = nullptr; } auto d_ptr = annotated_arg{d}; for (int i = 0; i < 4; i++) d_ptr[i] = i; @@ -118,44 +115,54 @@ catch (sycl::exception&) {d = nullptr;} annotated_arg> f = MyStruct(6); annotated_arg> g = MyStruct(3); annotated_arg> h = MyStruct(2); - try { + +try { auto *r1 = malloc_shared>(5, Q); } -catch (sycl::exception&) { -r1 = nullptr; -} +catch (sycl::exception&) { r1 = nullptr; } try { auto *r2 = malloc_shared>(5, Q); } -catch (sycl::exception&) { -r2 = nullptr; +catch (sycl::exception&) { r2 = nullptr; } +try { + auto *r3 = malloc_shared>(5, Q); } - try { auto *r3 = malloc_shared>(5, Q);} -catch (sycl::exception&) {r3 = nullptr;} +catch (sycl::exception&) { r3 = nullptr; } // testing logical overloaded operators annotated_arg> m = MyStruct(true); annotated_arg> n = MyStruct(false); - try {auto *r4 = malloc_shared>(3, Q);} -catch (sycl::exception&) {r4 = nullptr;} - try {auto *r5 = malloc_shared>(3, Q);} -catch (sycl::exception&) {r5 = nullptr;} - try {auto *r6 = malloc_shared>(3, Q);} - catch (sycl::exception&) {r6 = nullptr;} +try { + auto *r4 = malloc_shared>(3, Q); +} +catch (sycl::exception&) { r4 = nullptr; } +try { + auto *r5 = malloc_shared>(3, Q); +} +catch (sycl::exception&) { r5 = nullptr; } +try { + auto *r6 = malloc_shared>(3, Q); +} +catch (sycl::exception&) { r6 = nullptr; } // testing bit shift overloaded operators annotated_arg> x = MyStruct(1); annotated_arg> y = MyStruct(2); annotated_arg> z = MyStruct(4); - try {auto *r7 = malloc_shared>(2, Q);} -catch (sycl::exception&) { r7 = nullptr; +try { + auto *r7 = malloc_shared>(2, Q); +} +catch (sycl::exception&) { r7 = nullptr; } +try { + auto *r8 = malloc_shared>(2, Q); +} +catch (sycl::exception&) { r8 = nullptr; } +try { + auto *r9 = malloc_shared>(2, Q); } - try { auto *r8 = malloc_shared>(2, Q);} -catch (sycl::exception&) { r8 = nullptr;} - try {auto *r9 = malloc_shared>(2, Q);} -catch (sycl::exception&) { r9 = nullptr;} +catch (sycl::exception&) { r9 = nullptr; } Q.single_task([=]() { a_ptr[0] += 1; From 1091fe98b80f70a1bcd7f506375e71de96dd8f6c Mon Sep 17 00:00:00 2001 From: Lorenc Bushi Date: Mon, 29 Jan 2024 15:40:42 -0800 Subject: [PATCH 06/20] Add try/catch clauses --- .../Annotated_arg_ptr/annotated_arg.cpp | 126 ++++++++++-------- 1 file changed, 70 insertions(+), 56 deletions(-) diff --git a/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp b/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp index d241406a319d2..a512f9cfd87d7 100644 --- a/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp +++ b/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp @@ -76,36 +76,41 @@ MyStruct operator<<(const MyStruct &lhs, const MyStruct &rhs) { int main() { queue Q; -try { - auto *a = malloc_shared(8, Q); -} -catch (sycl::exception&) { a = nullptr; } + try { + auto *a = malloc_shared(8, Q); + } catch (sycl::exception &) { + a = nullptr; + } auto a_ptr = annotated_arg{a}; for (int i = 0; i < 8; i++) a_ptr[i] = i; -try { - auto *b = malloc_shared(4, Q); -} -catch (sycl::exception&) { b = nullptr; } + try { + auto *b = malloc_shared(4, Q); + } catch (sycl::exception &) { + b = nullptr; + } auto b_ptr = annotated_arg{b}; -try { - auto *c = malloc_shared(1, Q); -} -catch (sycl::exception&) { c = nullptr; } -try { - c->b = malloc_shared(1, Q); -} -catch (sycl::exception&) { c->b = nullptr; } + try { + auto *c = malloc_shared(1, Q); + } catch (sycl::exception &) { + c = nullptr; + } + try { + c->b = malloc_shared(1, Q); + } catch (sycl::exception &) { + c->b = nullptr; + } auto c_ptr = annotated_arg{c}; c_ptr->a = 0; c_ptr->b[0] = 0; -try { - auto *d = malloc_shared(4, Q); -} -catch (sycl::exception&) { d = nullptr; } + try { + auto *d = malloc_shared(4, Q); + } catch (sycl::exception &) { + d = nullptr; + } auto d_ptr = annotated_arg{d}; for (int i = 0; i < 4; i++) d_ptr[i] = i; @@ -116,53 +121,62 @@ catch (sycl::exception&) { d = nullptr; } annotated_arg> g = MyStruct(3); annotated_arg> h = MyStruct(2); -try { - auto *r1 = malloc_shared>(5, Q); -} -catch (sycl::exception&) { r1 = nullptr; } -try { - auto *r2 = malloc_shared>(5, Q); -} -catch (sycl::exception&) { r2 = nullptr; } -try { - auto *r3 = malloc_shared>(5, Q); -} -catch (sycl::exception&) { r3 = nullptr; } + try { + auto *r1 = malloc_shared>(5, Q); + } catch (sycl::exception &) { + r1 = nullptr; + } + try { + auto *r2 = malloc_shared>(5, Q); + } catch (sycl::exception &) { + r2 = nullptr; + } + try { + auto *r3 = malloc_shared>(5, Q); + } catch (sycl::exception &) { + r3 = nullptr; + } // testing logical overloaded operators annotated_arg> m = MyStruct(true); annotated_arg> n = MyStruct(false); -try { - auto *r4 = malloc_shared>(3, Q); -} -catch (sycl::exception&) { r4 = nullptr; } -try { - auto *r5 = malloc_shared>(3, Q); -} -catch (sycl::exception&) { r5 = nullptr; } -try { - auto *r6 = malloc_shared>(3, Q); -} -catch (sycl::exception&) { r6 = nullptr; } + try { + auto *r4 = malloc_shared>(3, Q); + } catch (sycl::exception &) { + r4 = nullptr; + } + try { + auto *r5 = malloc_shared>(3, Q); + } catch (sycl::exception &) { + r5 = nullptr; + } + try { + auto *r6 = malloc_shared>(3, Q); + } catch (sycl::exception &) { + r6 = nullptr; + } // testing bit shift overloaded operators annotated_arg> x = MyStruct(1); annotated_arg> y = MyStruct(2); annotated_arg> z = MyStruct(4); -try { - auto *r7 = malloc_shared>(2, Q); -} -catch (sycl::exception&) { r7 = nullptr; } -try { - auto *r8 = malloc_shared>(2, Q); -} -catch (sycl::exception&) { r8 = nullptr; } -try { - auto *r9 = malloc_shared>(2, Q); -} -catch (sycl::exception&) { r9 = nullptr; } + try { + auto *r7 = malloc_shared>(2, Q); + } catch (sycl::exception &) { + r7 = nullptr; + } + try { + auto *r8 = malloc_shared>(2, Q); + } catch (sycl::exception &) { + r8 = nullptr; + } + try { + auto *r9 = malloc_shared>(2, Q); + } catch (sycl::exception &) { + r9 = nullptr; + } Q.single_task([=]() { a_ptr[0] += 1; From 1c2f31aa1f390fe9ceb19417b8207d6e40929b97 Mon Sep 17 00:00:00 2001 From: Lorenc Bushi Date: Tue, 30 Jan 2024 09:58:52 -0800 Subject: [PATCH 07/20] Handle malloc_shared exceptions in tests --- .../Annotated_arg_ptr/annotated_arg.cpp | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp b/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp index a512f9cfd87d7..d6774bc7ae70a 100644 --- a/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp +++ b/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp @@ -3,7 +3,7 @@ // #include "common.hpp" - +#include struct test { int a; int *b; @@ -76,40 +76,40 @@ MyStruct operator<<(const MyStruct &lhs, const MyStruct &rhs) { int main() { queue Q; + int *a = nullptr; try { - auto *a = malloc_shared(8, Q); + a = malloc_shared(8, Q); } catch (sycl::exception &) { - a = nullptr; } auto a_ptr = annotated_arg{a}; for (int i = 0; i < 8; i++) a_ptr[i] = i; - + std::cout << "Hello!" << std::endl; + int *b = nullptr; try { - auto *b = malloc_shared(4, Q); + b = malloc_shared(4, Q); } catch (sycl::exception &) { - b = nullptr; } auto b_ptr = annotated_arg{b}; + test *c = nullptr; try { - auto *c = malloc_shared(1, Q); + c = malloc_shared(1, Q); } catch (sycl::exception &) { - c = nullptr; } + c->b = nullptr; try { c->b = malloc_shared(1, Q); } catch (sycl::exception &) { - c->b = nullptr; } auto c_ptr = annotated_arg{c}; c_ptr->a = 0; c_ptr->b[0] = 0; + int *d = nullptr; try { - auto *d = malloc_shared(4, Q); + d = malloc_shared(4, Q); } catch (sycl::exception &) { - d = nullptr; } auto d_ptr = annotated_arg{d}; for (int i = 0; i < 4; i++) @@ -121,40 +121,40 @@ int main() { annotated_arg> g = MyStruct(3); annotated_arg> h = MyStruct(2); + MyStruct *r1 = nullptr; try { - auto *r1 = malloc_shared>(5, Q); + r1 = malloc_shared>(5, Q); } catch (sycl::exception &) { - r1 = nullptr; } + MyStruct *r2 = nullptr; try { - auto *r2 = malloc_shared>(5, Q); + r2 = malloc_shared>(5, Q); } catch (sycl::exception &) { - r2 = nullptr; } + MyStruct *r3 = nullptr; try { - auto *r3 = malloc_shared>(5, Q); + r3 = malloc_shared>(5, Q); } catch (sycl::exception &) { - r3 = nullptr; } // testing logical overloaded operators annotated_arg> m = MyStruct(true); annotated_arg> n = MyStruct(false); + MyStruct *r4 = nullptr; try { - auto *r4 = malloc_shared>(3, Q); + r4 = malloc_shared>(3, Q); } catch (sycl::exception &) { - r4 = nullptr; } + MyStruct *r5 = nullptr; try { - auto *r5 = malloc_shared>(3, Q); + r5 = malloc_shared>(3, Q); } catch (sycl::exception &) { - r5 = nullptr; } + MyStruct *r6 = nullptr; try { - auto *r6 = malloc_shared>(3, Q); + r6 = malloc_shared>(3, Q); } catch (sycl::exception &) { - r6 = nullptr; } // testing bit shift overloaded operators @@ -162,20 +162,20 @@ int main() { annotated_arg> y = MyStruct(2); annotated_arg> z = MyStruct(4); + MyStruct *r7 = nullptr; try { - auto *r7 = malloc_shared>(2, Q); + r7 = malloc_shared>(2, Q); } catch (sycl::exception &) { - r7 = nullptr; } + MyStruct *r8 = nullptr; try { - auto *r8 = malloc_shared>(2, Q); + r8 = malloc_shared>(2, Q); } catch (sycl::exception &) { - r8 = nullptr; } + MyStruct *r9 = nullptr; try { - auto *r9 = malloc_shared>(2, Q); + r9 = malloc_shared>(2, Q); } catch (sycl::exception &) { - r9 = nullptr; } Q.single_task([=]() { From 3303a96f84a917eeffab9dc9ba040aa5dd85bfc6 Mon Sep 17 00:00:00 2001 From: Lorenc Bushi Date: Tue, 30 Jan 2024 14:55:11 -0800 Subject: [PATCH 08/20] Remove debugging statements --- sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp b/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp index d6774bc7ae70a..997381d0f4941 100644 --- a/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp +++ b/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp @@ -3,7 +3,6 @@ // #include "common.hpp" -#include struct test { int a; int *b; @@ -84,7 +83,6 @@ int main() { auto a_ptr = annotated_arg{a}; for (int i = 0; i < 8; i++) a_ptr[i] = i; - std::cout << "Hello!" << std::endl; int *b = nullptr; try { b = malloc_shared(4, Q); From ffcac5f90bc83a9d64569d18d712f036956d6507 Mon Sep 17 00:00:00 2001 From: Lorenc Bushi Date: Tue, 30 Jan 2024 16:05:57 -0800 Subject: [PATCH 09/20] Remove try/catch clauses --- .../Annotated_arg_ptr/annotated_arg.cpp | 86 ++++--------------- 1 file changed, 16 insertions(+), 70 deletions(-) diff --git a/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp b/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp index 997381d0f4941..8fad623752873 100644 --- a/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp +++ b/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp @@ -3,6 +3,7 @@ // #include "common.hpp" + struct test { int a; int *b; @@ -75,40 +76,21 @@ MyStruct operator<<(const MyStruct &lhs, const MyStruct &rhs) { int main() { queue Q; - int *a = nullptr; - try { - a = malloc_shared(8, Q); - } catch (sycl::exception &) { - } + auto *a = malloc_shared(8, Q); auto a_ptr = annotated_arg{a}; for (int i = 0; i < 8; i++) a_ptr[i] = i; - int *b = nullptr; - try { - b = malloc_shared(4, Q); - } catch (sycl::exception &) { - } + + auto *b = malloc_shared(4, Q); auto b_ptr = annotated_arg{b}; - test *c = nullptr; - try { - c = malloc_shared(1, Q); - } catch (sycl::exception &) { - } - c->b = nullptr; - try { - c->b = malloc_shared(1, Q); - } catch (sycl::exception &) { - } + auto *c = malloc_shared(1, Q); + c->b = malloc_shared(1, Q); auto c_ptr = annotated_arg{c}; c_ptr->a = 0; c_ptr->b[0] = 0; - int *d = nullptr; - try { - d = malloc_shared(4, Q); - } catch (sycl::exception &) { - } + auto *d = malloc_shared(4, Q); auto d_ptr = annotated_arg{d}; for (int i = 0; i < 4; i++) d_ptr[i] = i; @@ -119,62 +101,26 @@ int main() { annotated_arg> g = MyStruct(3); annotated_arg> h = MyStruct(2); - MyStruct *r1 = nullptr; - try { - r1 = malloc_shared>(5, Q); - } catch (sycl::exception &) { - } - MyStruct *r2 = nullptr; - try { - r2 = malloc_shared>(5, Q); - } catch (sycl::exception &) { - } - MyStruct *r3 = nullptr; - try { - r3 = malloc_shared>(5, Q); - } catch (sycl::exception &) { - } + auto *r1 = malloc_shared>(5, Q); + auto *r2 = malloc_shared>(5, Q); + auto *r3 = malloc_shared>(5, Q); // testing logical overloaded operators annotated_arg> m = MyStruct(true); annotated_arg> n = MyStruct(false); - MyStruct *r4 = nullptr; - try { - r4 = malloc_shared>(3, Q); - } catch (sycl::exception &) { - } - MyStruct *r5 = nullptr; - try { - r5 = malloc_shared>(3, Q); - } catch (sycl::exception &) { - } - MyStruct *r6 = nullptr; - try { - r6 = malloc_shared>(3, Q); - } catch (sycl::exception &) { - } + auto *r4 = malloc_shared>(3, Q); + auto *r5 = malloc_shared>(3, Q); + auto *r6 = malloc_shared>(3, Q); // testing bit shift overloaded operators annotated_arg> x = MyStruct(1); annotated_arg> y = MyStruct(2); annotated_arg> z = MyStruct(4); - MyStruct *r7 = nullptr; - try { - r7 = malloc_shared>(2, Q); - } catch (sycl::exception &) { - } - MyStruct *r8 = nullptr; - try { - r8 = malloc_shared>(2, Q); - } catch (sycl::exception &) { - } - MyStruct *r9 = nullptr; - try { - r9 = malloc_shared>(2, Q); - } catch (sycl::exception &) { - } + auto *r7 = malloc_shared>(2, Q); + auto *r8 = malloc_shared>(2, Q); + auto *r9 = malloc_shared>(2, Q); Q.single_task([=]() { a_ptr[0] += 1; From 2326311843fe1aca3f6c4eb78f55cf0b4cf689f8 Mon Sep 17 00:00:00 2001 From: Lorenc Bushi Date: Tue, 30 Jan 2024 17:01:59 -0800 Subject: [PATCH 10/20] Check if device has aspect --- sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp b/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp index 8fad623752873..e387080c0b052 100644 --- a/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp +++ b/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.cpp @@ -75,6 +75,9 @@ MyStruct operator<<(const MyStruct &lhs, const MyStruct &rhs) { int main() { queue Q; + if (!Q.get_device().has(aspect::usm_shared_allocations)) { + return 0; + } auto *a = malloc_shared(8, Q); auto a_ptr = annotated_arg{a}; From 5e41f652575076429f0c0312e5dade43fbe05783 Mon Sep 17 00:00:00 2001 From: Lorenc Bushi Date: Wed, 31 Jan 2024 10:33:25 -0800 Subject: [PATCH 11/20] Update tests to require usm_shared_allocations aspect --- .../Annotated_arg_ptr/annotated_arg.out | Bin 0 -> 163152 bytes .../Annotated_arg_ptr/annotated_ptr.cpp | 1 + .../Annotated_usm/annotated_usm_kind.cpp | 34 +++++---- sycl/test-e2e/Basic/group_local_memory.cpp | 1 + sycl/test-e2e/Basic/large-range.cpp | 1 + sycl/test-e2e/Basic/span.cpp | 1 + sycl/test-e2e/Basic/wrapped_usm_pointers.cpp | 1 + .../Complex/sycl_complex_math_test.cpp | 1 + .../Complex/sycl_complex_operator_test.cpp | 1 + .../Complex/sycl_complex_pow_test.cpp | 1 + .../Complex/sycl_complex_stream_test.cpp | 1 + .../discard_events_mixed_calls.cpp | 1 + .../DiscardEvents/discard_events_usm.cpp | 1 + .../discard_events_usm_ooo_queue.cpp | 1 + sycl/test-e2e/DiscardEvents/invalid_event.cpp | 1 + .../exclusive_scan_over_group.cpp | 1 + sycl/test-e2e/GroupAlgorithm/root_group.cpp | 2 + .../InOrderEventsExt/get_last_event.cpp | 2 +- .../InOrderEventsExt/set_external_event.cpp | 1 + .../KernelAndProgram/disable-caching.cpp | 1 + .../sync_two_queues_event_dep.cpp | 1 + .../test-e2e/KernelFusion/sync_usm_mem_op.cpp | 1 + .../test-e2e/Reduction/reduction_internal.cpp | 2 +- .../Reduction/reduction_range_item.cpp | 1 + sycl/test-e2e/Reduction/reduction_span.cpp | 1 + .../Reduction/reduction_span_pack.cpp | 1 + .../Regression/exclusive-scan-char-short.cpp | 1 + .../Regression/group_local_linear_id.cpp | 1 + sycl/test-e2e/Regression/half_operators.cpp | 1 + sycl/test-e2e/Regression/pf-wg-atomic64.cpp | 1 + .../Regression/range-rounding-this-id.cpp | 1 + .../Regression/reduction_64bit_atomic64.cpp | 1 + sycl/test-e2e/USM/alloc_functions.cpp | 7 +- sycl/test-e2e/USM/badmalloc.cpp | 20 +++-- sycl/test-e2e/USM/dep_events.cpp | 2 +- .../memory/memory_management_test2.cpp | 1 + .../syclcompat/memory/usm_allocations.cpp | 1 + .../test-e2e/syclcompat/util/util_complex.cpp | 2 +- .../syclcompat/util/util_find_first_set.cpp | 1 + .../util/util_permute_sub_group_by_xor.cpp | 1 + .../util/util_select_from_sub_group.cpp | 1 + .../util/util_shift_sub_group_left.cpp | 1 + .../util/util_shift_sub_group_right.cpp | 1 + .../scheduler/InOrderQueueHostTaskDeps.cpp | 72 +++++++++--------- sycl/unittests/xpti_trace/QueueIDCheck.cpp | 2 +- 45 files changed, 114 insertions(+), 65 deletions(-) create mode 100755 sycl/test-e2e/Annotated_arg_ptr/annotated_arg.out diff --git a/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.out b/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.out new file mode 100755 index 0000000000000000000000000000000000000000..90cd7da3f56d8a680c6e3042cacf8230933f8e1b GIT binary patch literal 163152 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

;-=(_-_8s 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 literal 0 HcmV?d00001 diff --git a/sycl/test-e2e/Annotated_arg_ptr/annotated_ptr.cpp b/sycl/test-e2e/Annotated_arg_ptr/annotated_ptr.cpp index 7e4a35d09b994..81a1442d23829 100644 --- a/sycl/test-e2e/Annotated_arg_ptr/annotated_ptr.cpp +++ b/sycl/test-e2e/Annotated_arg_ptr/annotated_ptr.cpp @@ -1,3 +1,4 @@ +// REQUIRES: usm_shared_allocations // RUN: %{build} -o %t.out // RUN: %{run} %t.out // diff --git a/sycl/test-e2e/Annotated_usm/annotated_usm_kind.cpp b/sycl/test-e2e/Annotated_usm/annotated_usm_kind.cpp index 812a0bb115737..bccd8b9cf072c 100644 --- a/sycl/test-e2e/Annotated_usm/annotated_usm_kind.cpp +++ b/sycl/test-e2e/Annotated_usm/annotated_usm_kind.cpp @@ -125,25 +125,27 @@ template void testUsmKind(sycl::queue &q) { [&]() { return ATHost(1, q); }, [&]() { return ATHost(1, Ctx); }, [&]() { return ATAnnotated(1, dev, Ctx, alloc::host); }}); - CheckUsmKindAll( - alloc::shared, - std::tuple{ - [&]() { return MShared(q); }, [&]() { return MShared(dev, Ctx); }, - [&]() { return MAnnotated(dev, Ctx, alloc::shared); }, - [&]() { return MAnnotated(dev, Ctx, properties{usm_kind_shared}); }, - [&]() { return AShared(1, q); }, - [&]() { return AShared(1, dev, Ctx); }, - [&]() { return AAnnotated(1, dev, Ctx, alloc::shared); }, - [&]() { return TShared(q); }, [&]() { return TShared(dev, Ctx); }, - [&]() { return TAnnotated(dev, Ctx, alloc::shared); }, - [&]() { return TAnnotated(dev, Ctx, properties{usm_kind_shared}); }, - [&]() { return ATShared(1, q); }, - [&]() { return ATShared(1, dev, Ctx); }, - [&]() { return ATAnnotated(1, dev, Ctx, alloc::shared); }}); + if (q.get_device().has(sycl::aspect::usm_shared_allocations)) { + CheckUsmKindAll( + alloc::shared, + std::tuple{ + [&]() { return MShared(q); }, [&]() { return MShared(dev, Ctx); }, + [&]() { return MAnnotated(dev, Ctx, alloc::shared); }, + [&]() { return MAnnotated(dev, Ctx, properties{usm_kind_shared}); }, + [&]() { return AShared(1, q); }, + [&]() { return AShared(1, dev, Ctx); }, + [&]() { return AAnnotated(1, dev, Ctx, alloc::shared); }, + [&]() { return TShared(q); }, [&]() { return TShared(dev, Ctx); }, + [&]() { return TAnnotated(dev, Ctx, alloc::shared); }, + [&]() { return TAnnotated(dev, Ctx, properties{usm_kind_shared}); }, + [&]() { return ATShared(1, q); }, + [&]() { return ATShared(1, dev, Ctx); }, + [&]() { return ATAnnotated(1, dev, Ctx, alloc::shared); }}); + } } int main() { sycl::queue q; testUsmKind(q); return 0; -} \ No newline at end of file +} diff --git a/sycl/test-e2e/Basic/group_local_memory.cpp b/sycl/test-e2e/Basic/group_local_memory.cpp index 8185378071c75..52243b7f780f3 100644 --- a/sycl/test-e2e/Basic/group_local_memory.cpp +++ b/sycl/test-e2e/Basic/group_local_memory.cpp @@ -1,3 +1,4 @@ +// REQUIRES: usm_shared_allocations // RUN: %{build} -o %t.out // RUN: %{run} %t.out diff --git a/sycl/test-e2e/Basic/large-range.cpp b/sycl/test-e2e/Basic/large-range.cpp index 354276065a739..7e320b89c2dc9 100644 --- a/sycl/test-e2e/Basic/large-range.cpp +++ b/sycl/test-e2e/Basic/large-range.cpp @@ -1,3 +1,4 @@ +// REQUIRES: usm_shared_allocation // Temporarily add explicit '-O2' to avoid GPU hang issue with O0 optimization. // RUN: %{build} -fno-sycl-id-queries-fit-in-int -O2 -o %t.out // RUN: env SYCL_PARALLEL_FOR_RANGE_ROUNDING_TRACE=1 %{run} %t.out diff --git a/sycl/test-e2e/Basic/span.cpp b/sycl/test-e2e/Basic/span.cpp index 43d16ff4d16d6..c90c9b7631854 100644 --- a/sycl/test-e2e/Basic/span.cpp +++ b/sycl/test-e2e/Basic/span.cpp @@ -1,3 +1,4 @@ +// REQUIRES: usm_shared_allocations // RUN: %{build} -o %t.out // RUN: %{run} %t.out // diff --git a/sycl/test-e2e/Basic/wrapped_usm_pointers.cpp b/sycl/test-e2e/Basic/wrapped_usm_pointers.cpp index 7b81493db6dce..14f2414ab8461 100644 --- a/sycl/test-e2e/Basic/wrapped_usm_pointers.cpp +++ b/sycl/test-e2e/Basic/wrapped_usm_pointers.cpp @@ -1,3 +1,4 @@ +// REQUIRES: usm_shared_allocations // RUN: %{build} -o %t.out // RUN: %{run} %t.out diff --git a/sycl/test-e2e/Complex/sycl_complex_math_test.cpp b/sycl/test-e2e/Complex/sycl_complex_math_test.cpp index 9bb5122ffc7f7..ff5d6714c9704 100644 --- a/sycl/test-e2e/Complex/sycl_complex_math_test.cpp +++ b/sycl/test-e2e/Complex/sycl_complex_math_test.cpp @@ -1,3 +1,4 @@ +// REQUIRES: usm_shared_allocations // DEFINE: %{mathflags} = %if cl_options %{/clang:-fno-fast-math%} %else %{-fno-fast-math%} // RUN: %{build} -fsycl-device-code-split=per_kernel %{mathflags} -o %t.out diff --git a/sycl/test-e2e/Complex/sycl_complex_operator_test.cpp b/sycl/test-e2e/Complex/sycl_complex_operator_test.cpp index ed68332f60bdd..fb4df0db745af 100644 --- a/sycl/test-e2e/Complex/sycl_complex_operator_test.cpp +++ b/sycl/test-e2e/Complex/sycl_complex_operator_test.cpp @@ -1,3 +1,4 @@ +// REQUIRES: usm_shared_allocations // RUN: %{build} -fsycl-device-code-split=per_kernel -o %t.out // RUN: %{run} %t.out diff --git a/sycl/test-e2e/Complex/sycl_complex_pow_test.cpp b/sycl/test-e2e/Complex/sycl_complex_pow_test.cpp index c8555687eb49b..41764342d3c98 100644 --- a/sycl/test-e2e/Complex/sycl_complex_pow_test.cpp +++ b/sycl/test-e2e/Complex/sycl_complex_pow_test.cpp @@ -1,3 +1,4 @@ +// REQUIRES: usm_shared_allocations // DEFINE: %{mathflags} = %if cl_options %{/clang:-fno-fast-math%} %else %{-fno-fast-math%} // RUN: %{build} -fsycl-device-code-split=per_kernel %{mathflags} -o %t.out diff --git a/sycl/test-e2e/Complex/sycl_complex_stream_test.cpp b/sycl/test-e2e/Complex/sycl_complex_stream_test.cpp index b9cb8c519366d..3fa2e8f3bf772 100644 --- a/sycl/test-e2e/Complex/sycl_complex_stream_test.cpp +++ b/sycl/test-e2e/Complex/sycl_complex_stream_test.cpp @@ -7,6 +7,7 @@ template struct test_sycl_stream_operator { bool operator()(sycl::queue &Q, cmplx init) { + if (!Q.get_device().has(aspect::usm_shared_allocations)) return true; auto *cplx_out = sycl::malloc_shared>(1, Q); cplx_out[0] = experimental::complex(init.re, init.im); diff --git a/sycl/test-e2e/DiscardEvents/discard_events_mixed_calls.cpp b/sycl/test-e2e/DiscardEvents/discard_events_mixed_calls.cpp index 8206ea5b449c3..cfc4eff222e7a 100644 --- a/sycl/test-e2e/DiscardEvents/discard_events_mixed_calls.cpp +++ b/sycl/test-e2e/DiscardEvents/discard_events_mixed_calls.cpp @@ -37,6 +37,7 @@ static constexpr int MAX_ITER_NUM2 = 10; void TestHelper(sycl::queue Q, const std::function Range, int *Harray, sycl::buffer Buf)> &Function) { + if (!Q.get_device().has(aspect::usm_shared_allocation)) return; int *Harray = sycl::malloc_shared(BUFFER_SIZE, Q); assert(Harray != nullptr); for (size_t i = 0; i < BUFFER_SIZE; ++i) { diff --git a/sycl/test-e2e/DiscardEvents/discard_events_usm.cpp b/sycl/test-e2e/DiscardEvents/discard_events_usm.cpp index 11288d6620bfd..d85cc5ab4e2c8 100644 --- a/sycl/test-e2e/DiscardEvents/discard_events_usm.cpp +++ b/sycl/test-e2e/DiscardEvents/discard_events_usm.cpp @@ -1,3 +1,4 @@ +// REQUIRES: usm_shared_allocations // RUN: %{build} -o %t.out // RUN: env SYCL_PI_TRACE=2 %{run} %t.out &> %t.txt ; FileCheck %s --input-file %t.txt diff --git a/sycl/test-e2e/DiscardEvents/discard_events_usm_ooo_queue.cpp b/sycl/test-e2e/DiscardEvents/discard_events_usm_ooo_queue.cpp index cfe72db0c1232..98f1c1f256986 100644 --- a/sycl/test-e2e/DiscardEvents/discard_events_usm_ooo_queue.cpp +++ b/sycl/test-e2e/DiscardEvents/discard_events_usm_ooo_queue.cpp @@ -1,3 +1,4 @@ +// REQUIRES: usm_shared_allocations // RUN: %{build} -o %t.out // RUN: env SYCL_PI_TRACE=2 %{run} %t.out &> %t.txt ; FileCheck %s --input-file %t.txt diff --git a/sycl/test-e2e/DiscardEvents/invalid_event.cpp b/sycl/test-e2e/DiscardEvents/invalid_event.cpp index 273e74afb6c25..6c883e9a9274b 100644 --- a/sycl/test-e2e/DiscardEvents/invalid_event.cpp +++ b/sycl/test-e2e/DiscardEvents/invalid_event.cpp @@ -1,3 +1,4 @@ +// REQUIRES: usm_shared_allocations // Same hang as on Basic/barrier_order.cpp tracked in // https://github.com/intel/llvm/issues/7330. // UNSUPPORTED: opencl && gpu diff --git a/sycl/test-e2e/GroupAlgorithm/exclusive_scan_over_group.cpp b/sycl/test-e2e/GroupAlgorithm/exclusive_scan_over_group.cpp index 6411131ef33ff..6e8e540a58d54 100644 --- a/sycl/test-e2e/GroupAlgorithm/exclusive_scan_over_group.cpp +++ b/sycl/test-e2e/GroupAlgorithm/exclusive_scan_over_group.cpp @@ -1,3 +1,4 @@ +// REQUIRES: usm_shared_allocations // CPU and ACC not yet supported: // Unsupported SPIR-V module SPIRV module requires unsupported capability 6400 // REQUIRES: gpu diff --git a/sycl/test-e2e/GroupAlgorithm/root_group.cpp b/sycl/test-e2e/GroupAlgorithm/root_group.cpp index ba0c49fa68bf7..dc1bb0d85bccb 100644 --- a/sycl/test-e2e/GroupAlgorithm/root_group.cpp +++ b/sycl/test-e2e/GroupAlgorithm/root_group.cpp @@ -33,6 +33,7 @@ void testQueriesAndProperties() { void testRootGroup() { sycl::queue q; + if (!q.get_device().has(aspect::usm_shared_allocations)) return; const auto bundle = sycl::get_kernel_bundle(q.get_context()); const auto kernel = bundle.get_kernel(); @@ -66,6 +67,7 @@ void testRootGroup() { void testRootGroupFunctions() { sycl::queue q; + if (!q.get_device().has(aspect::usm_shared_allocation)) return; const auto bundle = sycl::get_kernel_bundle(q.get_context()); const auto kernel = bundle.get_kernel(); diff --git a/sycl/test-e2e/InOrderEventsExt/get_last_event.cpp b/sycl/test-e2e/InOrderEventsExt/get_last_event.cpp index 3393202b5a370..176ea5def6291 100644 --- a/sycl/test-e2e/InOrderEventsExt/get_last_event.cpp +++ b/sycl/test-e2e/InOrderEventsExt/get_last_event.cpp @@ -34,7 +34,7 @@ int main() { Failed += Check(Q, "host_task", [&]() { return Q.submit([&](sycl::handler &CGH) { CGH.host_task([]() {}); }); }); - + if (!Q.get_device().has(aspect::usm_shared_allocations)) return Failed; constexpr size_t N = 64; int *Data1 = sycl::malloc_shared(N, Q); int *Data2 = sycl::malloc_shared(N, Q); diff --git a/sycl/test-e2e/InOrderEventsExt/set_external_event.cpp b/sycl/test-e2e/InOrderEventsExt/set_external_event.cpp index 45e5815606dbe..927a7d43ca05b 100644 --- a/sycl/test-e2e/InOrderEventsExt/set_external_event.cpp +++ b/sycl/test-e2e/InOrderEventsExt/set_external_event.cpp @@ -1,3 +1,4 @@ +// REQUIRES: usm_shared_allocations // RUN: %{build} -o %t.out // RUN: %{run} %t.out diff --git a/sycl/test-e2e/KernelAndProgram/disable-caching.cpp b/sycl/test-e2e/KernelAndProgram/disable-caching.cpp index 4276efe36366f..4a5851b989d25 100644 --- a/sycl/test-e2e/KernelAndProgram/disable-caching.cpp +++ b/sycl/test-e2e/KernelAndProgram/disable-caching.cpp @@ -1,3 +1,4 @@ +// REQUIRES: usm_shared_allocations // This test ensures created program/kernels are not retained // if and only if caching is disabled. diff --git a/sycl/test-e2e/KernelFusion/sync_two_queues_event_dep.cpp b/sycl/test-e2e/KernelFusion/sync_two_queues_event_dep.cpp index 38286c48b8a0f..eb14704700aac 100644 --- a/sycl/test-e2e/KernelFusion/sync_two_queues_event_dep.cpp +++ b/sycl/test-e2e/KernelFusion/sync_two_queues_event_dep.cpp @@ -1,3 +1,4 @@ +// REQUIRES: usm_shared_allocations // For this test, complete_fusion must be supported. // RUN: %{build} -o %t.out // RUN: env SYCL_RT_WARNING_LEVEL=1 %{run} %t.out 2>&1 | FileCheck %s diff --git a/sycl/test-e2e/KernelFusion/sync_usm_mem_op.cpp b/sycl/test-e2e/KernelFusion/sync_usm_mem_op.cpp index 0e6bc288812fd..3be21c7345447 100644 --- a/sycl/test-e2e/KernelFusion/sync_usm_mem_op.cpp +++ b/sycl/test-e2e/KernelFusion/sync_usm_mem_op.cpp @@ -1,3 +1,4 @@ +// REQUIRES: usm_shared_allocations // RUN: %{build} -fsycl-embed-ir -o %t.out // RUN: env SYCL_RT_WARNING_LEVEL=1 %{run} %t.out 2>&1 | FileCheck %s diff --git a/sycl/test-e2e/Reduction/reduction_internal.cpp b/sycl/test-e2e/Reduction/reduction_internal.cpp index 57947a25176e1..a340fcd779d5f 100644 --- a/sycl/test-e2e/Reduction/reduction_internal.cpp +++ b/sycl/test-e2e/Reduction/reduction_internal.cpp @@ -80,7 +80,7 @@ static void test(RedStorage &Storage, RangeTy Range) { cgh, Range, ext::oneapi::experimental::empty_properties_t{}, RedSycl, [=](auto Item, auto &Red) { Red.combine(T{1}); }); }).wait(); - + if (!q.get_device().has(aspect::usm_shared_allocations)) return; auto *Result = malloc_shared(1, q); q.submit([&](handler &cgh) { auto RedAcc = GetRedAcc(cgh); diff --git a/sycl/test-e2e/Reduction/reduction_range_item.cpp b/sycl/test-e2e/Reduction/reduction_range_item.cpp index ed9806e4753b5..2afe55ef45f6e 100644 --- a/sycl/test-e2e/Reduction/reduction_range_item.cpp +++ b/sycl/test-e2e/Reduction/reduction_range_item.cpp @@ -1,3 +1,4 @@ +// REQUIRES: usm_shared_allocations // RUN: %{build} -o %t.out // RUN: %{run} %t.out diff --git a/sycl/test-e2e/Reduction/reduction_span.cpp b/sycl/test-e2e/Reduction/reduction_span.cpp index 6c06d377eabe2..86ceadb97a77b 100644 --- a/sycl/test-e2e/Reduction/reduction_span.cpp +++ b/sycl/test-e2e/Reduction/reduction_span.cpp @@ -1,3 +1,4 @@ +// REQUIRES: usm_shared_allocations // RUN: %{build} -o %t.out // RUN: %{run} %t.out diff --git a/sycl/test-e2e/Reduction/reduction_span_pack.cpp b/sycl/test-e2e/Reduction/reduction_span_pack.cpp index 46862ffe45cf9..e6f39ebc1af19 100644 --- a/sycl/test-e2e/Reduction/reduction_span_pack.cpp +++ b/sycl/test-e2e/Reduction/reduction_span_pack.cpp @@ -1,3 +1,4 @@ +// REQUIRES: usm_shared_allocations // RUN: %{build} -o %t.out // RUN: %{run} %t.out // diff --git a/sycl/test-e2e/Regression/exclusive-scan-char-short.cpp b/sycl/test-e2e/Regression/exclusive-scan-char-short.cpp index a7d3601210fa8..cdb273d051d10 100644 --- a/sycl/test-e2e/Regression/exclusive-scan-char-short.cpp +++ b/sycl/test-e2e/Regression/exclusive-scan-char-short.cpp @@ -1,3 +1,4 @@ +// REQUIRES: usm_shared_allocations // RUN: %{build} -o %t.out // RUN: %{run} %t.out diff --git a/sycl/test-e2e/Regression/group_local_linear_id.cpp b/sycl/test-e2e/Regression/group_local_linear_id.cpp index d3562c2b25cbf..02170a2991068 100644 --- a/sycl/test-e2e/Regression/group_local_linear_id.cpp +++ b/sycl/test-e2e/Regression/group_local_linear_id.cpp @@ -1,3 +1,4 @@ +// REQUIRES: usm_shared_allocations // RUN: %{build} -o %t.out // RUN: %{run} %t.out diff --git a/sycl/test-e2e/Regression/half_operators.cpp b/sycl/test-e2e/Regression/half_operators.cpp index b227806a02bc0..64f81affdfcc9 100644 --- a/sycl/test-e2e/Regression/half_operators.cpp +++ b/sycl/test-e2e/Regression/half_operators.cpp @@ -1,3 +1,4 @@ +// REQUIRES: usm_shared_allocations // REQUIRES: gpu // RUN: %{build} -fsycl-device-code-split=per_kernel -o %t.out // RUN: %{run} %t.out diff --git a/sycl/test-e2e/Regression/pf-wg-atomic64.cpp b/sycl/test-e2e/Regression/pf-wg-atomic64.cpp index f2985b5a33b1d..754f867a9f6a8 100644 --- a/sycl/test-e2e/Regression/pf-wg-atomic64.cpp +++ b/sycl/test-e2e/Regression/pf-wg-atomic64.cpp @@ -1,3 +1,4 @@ +// REQUIRES: usm_shared_allocations // DISABLED: aspect-atomic64 // RUN: %{build} -o %t.out // RUN: %{run} %t.out diff --git a/sycl/test-e2e/Regression/range-rounding-this-id.cpp b/sycl/test-e2e/Regression/range-rounding-this-id.cpp index 33fa41c60cc68..5fbf3ee3999a0 100644 --- a/sycl/test-e2e/Regression/range-rounding-this-id.cpp +++ b/sycl/test-e2e/Regression/range-rounding-this-id.cpp @@ -1,3 +1,4 @@ +// REQUIRE: usm_shared_allocations // This test ensures that this_id returns the correct value // even when a kernel is wrapped in a range rounding kernel. // RUN: %{build} -o %t.out diff --git a/sycl/test-e2e/Regression/reduction_64bit_atomic64.cpp b/sycl/test-e2e/Regression/reduction_64bit_atomic64.cpp index dc138d9b79da8..a9e3382ce1617 100644 --- a/sycl/test-e2e/Regression/reduction_64bit_atomic64.cpp +++ b/sycl/test-e2e/Regression/reduction_64bit_atomic64.cpp @@ -1,3 +1,4 @@ +// REQUIRES: usm_shared_allocations // REQUIRES: aspect-atomic64 // RUN: %{build} -o %t.out // diff --git a/sycl/test-e2e/USM/alloc_functions.cpp b/sycl/test-e2e/USM/alloc_functions.cpp index 9a7744e046725..278140a83b705 100644 --- a/sycl/test-e2e/USM/alloc_functions.cpp +++ b/sycl/test-e2e/USM/alloc_functions.cpp @@ -84,14 +84,17 @@ int main() { [&]() { return MHost(q, property_list{}); }, [&]() { return MHost(ctx, property_list{}); }}); + if (q.get_device().has(aspect::usm_shared_allocations)) { auto MShared = [&](auto... args) { return malloc_shared(sizeof(std::max_align_t), args...); }; + CheckAll(FAlign, std::tuple{[&]() { return MShared(q); }, [&]() { return MShared(d, ctx); }, [&]() { return MShared(q, property_list{}); }, [&]() { return MShared(d, ctx, property_list{}); }}); +} auto ADevice = [&](size_t Align, auto... args) { return aligned_alloc_device(Align, sizeof(std::max_align_t), args...); @@ -150,11 +153,13 @@ int main() { CheckAll(Align, std::tuple{[&]() { return THost(q); }, [&]() { return THost(ctx); }}); - auto TShared = [&](auto... args) { + if (q.get_device().has(aspect::usm_shared_allocations)) { +auto TShared = [&](auto... args) { return malloc_shared(1, args...); }; CheckAll(Align, std::tuple{[&]() { return TShared(q); }, [&]() { return TShared(d, ctx); }}); +} auto ATDevice = [&](size_t Align, auto... args) { return aligned_alloc_device(Align, 1, args...); diff --git a/sycl/test-e2e/USM/badmalloc.cpp b/sycl/test-e2e/USM/badmalloc.cpp index f670cb4e6b441..16e30779dc3c4 100644 --- a/sycl/test-e2e/USM/badmalloc.cpp +++ b/sycl/test-e2e/USM/badmalloc.cpp @@ -36,10 +36,12 @@ int main(int argc, char *argv[]) { std::cout << "p = " << p << std::endl; if (p != nullptr) return 3; - p = malloc(-1, q, usm::alloc::shared); - std::cout << "p = " << p << std::endl; - if (p != nullptr) - return 4; + if (q.get_device().has(aspect::usm_shared_allocations)) { + p = malloc(-1, q, usm::alloc::shared); + std::cout << "p = " << p << std::endl; + if (p != nullptr) + return 4; + } p = malloc(-1, q, usm::alloc::unknown); std::cout << "p = " << p << std::endl; if (p != nullptr) @@ -54,10 +56,12 @@ int main(int argc, char *argv[]) { std::cout << "p = " << p << std::endl; if (p != nullptr) return 7; - p = aligned_alloc(0, -1, q, usm::alloc::shared); - std::cout << "p = " << p << std::endl; - if (p != nullptr) - return 8; + if (q.get_device().has(aspect::usm_shared_allocations)) { + p = aligned_alloc(0, -1, q, usm::alloc::shared); + std::cout << "p = " << p << std::endl; + if (p != nullptr) + return 8; + } p = aligned_alloc(0, -1, q, usm::alloc::unknown); std::cout << "p = " << p << std::endl; if (p != nullptr) diff --git a/sycl/test-e2e/USM/dep_events.cpp b/sycl/test-e2e/USM/dep_events.cpp index b70dd99f5400f..ea48a6cd20202 100644 --- a/sycl/test-e2e/USM/dep_events.cpp +++ b/sycl/test-e2e/USM/dep_events.cpp @@ -5,7 +5,7 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// - +// REQUIRES: usm_shared_allocations // RUN: %{build} -o %t1.out // RUN: %{run} %t1.out diff --git a/sycl/test-e2e/syclcompat/memory/memory_management_test2.cpp b/sycl/test-e2e/syclcompat/memory/memory_management_test2.cpp index c60d22402971f..9774faa8e8ba7 100644 --- a/sycl/test-e2e/syclcompat/memory/memory_management_test2.cpp +++ b/sycl/test-e2e/syclcompat/memory/memory_management_test2.cpp @@ -30,6 +30,7 @@ // // ===----------------------------------------------------------------------===// +// REQUIRES: usm_shared_allocations // RUN: %clangxx -std=c++20 -fsycl -fsycl-targets=%{sycl_triple} %s -o %t.out // RUN: %{run} %t.out diff --git a/sycl/test-e2e/syclcompat/memory/usm_allocations.cpp b/sycl/test-e2e/syclcompat/memory/usm_allocations.cpp index 6feed8f705c2e..fb8a8a52da101 100644 --- a/sycl/test-e2e/syclcompat/memory/usm_allocations.cpp +++ b/sycl/test-e2e/syclcompat/memory/usm_allocations.cpp @@ -20,6 +20,7 @@ * USM allocation tests **************************************************************************/ +// REQUIRES: usm_shared_allocations // RUN: %clangxx -std=c++20 -fsycl -fsycl-targets=%{sycl_triple} %s -o %t.out // RUN: %{run} %t.out diff --git a/sycl/test-e2e/syclcompat/util/util_complex.cpp b/sycl/test-e2e/syclcompat/util/util_complex.cpp index cd4e7150317b3..0e680dbdd17e4 100644 --- a/sycl/test-e2e/syclcompat/util/util_complex.cpp +++ b/sycl/test-e2e/syclcompat/util/util_complex.cpp @@ -30,7 +30,7 @@ //===---------------------------------------------------------------===// // REQUIRES: aspect-fp64 - +// REQUIRES: usm_shared_allocations // RUN: %clangxx -fsycl -fsycl-targets=%{sycl_triple} %s -o %t.out // RUN: %{run} %t.out diff --git a/sycl/test-e2e/syclcompat/util/util_find_first_set.cpp b/sycl/test-e2e/syclcompat/util/util_find_first_set.cpp index c350049ff1d72..d4aa398546c3c 100644 --- a/sycl/test-e2e/syclcompat/util/util_find_first_set.cpp +++ b/sycl/test-e2e/syclcompat/util/util_find_first_set.cpp @@ -30,6 +30,7 @@ // // ===----------------------------------------------------------------------===// +// REQUIRES: usm_shared_allocations // RUN: %clangxx -fsycl -fsycl-targets=%{sycl_triple} %s -o %t.out // RUN: %{run} %t.out diff --git a/sycl/test-e2e/syclcompat/util/util_permute_sub_group_by_xor.cpp b/sycl/test-e2e/syclcompat/util/util_permute_sub_group_by_xor.cpp index a5736c24e104f..c79668b698c55 100644 --- a/sycl/test-e2e/syclcompat/util/util_permute_sub_group_by_xor.cpp +++ b/sycl/test-e2e/syclcompat/util/util_permute_sub_group_by_xor.cpp @@ -30,6 +30,7 @@ // // ===----------------------------------------------------------------------===// +// REQUIRES: usm_shared_allocations // REQUIRES: sg-32 // RUN: %clangxx -fsycl -fsycl-targets=%{sycl_triple} %s -o %t.out // RUN: %{run} %t.out diff --git a/sycl/test-e2e/syclcompat/util/util_select_from_sub_group.cpp b/sycl/test-e2e/syclcompat/util/util_select_from_sub_group.cpp index 78579ebc085ad..b2798cf6be6b8 100644 --- a/sycl/test-e2e/syclcompat/util/util_select_from_sub_group.cpp +++ b/sycl/test-e2e/syclcompat/util/util_select_from_sub_group.cpp @@ -30,6 +30,7 @@ // // ===----------------------------------------------------------------------===// +// REQUIRES: usm_shared_allocations // REQUIRES: sg-32 // RUN: %clangxx -fsycl -fsycl-targets=%{sycl_triple} %s -o %t.out // RUN: %{run} %t.out diff --git a/sycl/test-e2e/syclcompat/util/util_shift_sub_group_left.cpp b/sycl/test-e2e/syclcompat/util/util_shift_sub_group_left.cpp index c09b8aac444ee..a688a59647228 100644 --- a/sycl/test-e2e/syclcompat/util/util_shift_sub_group_left.cpp +++ b/sycl/test-e2e/syclcompat/util/util_shift_sub_group_left.cpp @@ -30,6 +30,7 @@ // // ===----------------------------------------------------------------------===// +// REQUIRES: usm_shared_allocations // REQUIRES: sg-32 // RUN: %clangxx -fsycl -fsycl-targets=%{sycl_triple} %s -o %t.out // RUN: %{run} %t.out diff --git a/sycl/test-e2e/syclcompat/util/util_shift_sub_group_right.cpp b/sycl/test-e2e/syclcompat/util/util_shift_sub_group_right.cpp index c38b232911a3d..65b24a6c24051 100644 --- a/sycl/test-e2e/syclcompat/util/util_shift_sub_group_right.cpp +++ b/sycl/test-e2e/syclcompat/util/util_shift_sub_group_right.cpp @@ -30,6 +30,7 @@ // // ===----------------------------------------------------------------------===// +// REQUIRES: usm_shared_allocations // REQUIRES: sg-32 // RUN: %clangxx -fsycl -fsycl-targets=%{sycl_triple} %s -o %t.out // RUN: %{run} %t.out diff --git a/sycl/unittests/scheduler/InOrderQueueHostTaskDeps.cpp b/sycl/unittests/scheduler/InOrderQueueHostTaskDeps.cpp index 37bb5106d75b2..1b252da1643af 100644 --- a/sycl/unittests/scheduler/InOrderQueueHostTaskDeps.cpp +++ b/sycl/unittests/scheduler/InOrderQueueHostTaskDeps.cpp @@ -95,30 +95,31 @@ TEST_F(SchedulerTest, InOrderQueueCrossDeps) { Cv.wait(lk, [&ready] { return ready; }); }); }); + if (InOrderQueue.get_device().has(aspect::usm_shared_allocations)) { + auto buf = sycl::malloc_shared(1, InOrderQueue); - auto buf = sycl::malloc_shared(1, InOrderQueue); - - event Ev1 = InOrderQueue.submit( - [&](sycl::handler &CGH) { CGH.memset(buf, 0, sizeof(buf[0])); }); + event Ev1 = InOrderQueue.submit( + [&](sycl::handler &CGH) { CGH.memset(buf, 0, sizeof(buf[0])); }); - event Ev2 = InOrderQueue.submit([&](sycl::handler &CGH) { - CGH.use_kernel_bundle(ExecBundle); - CGH.single_task>([] {}); - }); + event Ev2 = InOrderQueue.submit([&](sycl::handler &CGH) { + CGH.use_kernel_bundle(ExecBundle); + CGH.single_task>([] {}); + }); - { - std::unique_lock lk(CvMutex); - ready = true; - } - Cv.notify_one(); + { + std::unique_lock lk(CvMutex); + ready = true; + } + Cv.notify_one(); - InOrderQueue.wait(); + InOrderQueue.wait(); - ASSERT_EQ(ExecutedCommands.size(), 2u); - EXPECT_EQ(ExecutedCommands[0].first /*CommandType*/, CommandType::MEMSET); - EXPECT_EQ(ExecutedCommands[0].second /*EventsCount*/, 0u); - EXPECT_EQ(ExecutedCommands[1].first /*CommandType*/, CommandType::KERNEL); - EXPECT_EQ(ExecutedCommands[1].second /*EventsCount*/, 0u); + ASSERT_EQ(ExecutedCommands.size(), 2u); + EXPECT_EQ(ExecutedCommands[0].first /*CommandType*/, CommandType::MEMSET); + EXPECT_EQ(ExecutedCommands[0].second /*EventsCount*/, 0u); + EXPECT_EQ(ExecutedCommands[1].first /*CommandType*/, CommandType::KERNEL); + EXPECT_EQ(ExecutedCommands[1].second /*EventsCount*/, 0u); + } } TEST_F(SchedulerTest, InOrderQueueCrossDepsShortcutFuncs) { @@ -148,24 +149,25 @@ TEST_F(SchedulerTest, InOrderQueueCrossDepsShortcutFuncs) { Cv.wait(lk, [&ready] { return ready; }); }); }); + if (InOrderQueue.get_device().has(aspect::usm_shared_allocations)) { + auto buf = sycl::malloc_shared(1, InOrderQueue); - auto buf = sycl::malloc_shared(1, InOrderQueue); - - event Ev1 = InOrderQueue.memset(buf, 0, sizeof(buf[0])); + event Ev1 = InOrderQueue.memset(buf, 0, sizeof(buf[0])); - event Ev2 = InOrderQueue.single_task>([] {}); + event Ev2 = InOrderQueue.single_task>([] {}); - { - std::unique_lock lk(CvMutex); - ready = true; - } - Cv.notify_one(); + { + std::unique_lock lk(CvMutex); + ready = true; + } + Cv.notify_one(); - InOrderQueue.wait(); + InOrderQueue.wait(); - ASSERT_EQ(ExecutedCommands.size(), 2u); - EXPECT_EQ(ExecutedCommands[0].first /*CommandType*/, CommandType::MEMSET); - EXPECT_EQ(ExecutedCommands[0].second /*EventsCount*/, 0u); - EXPECT_EQ(ExecutedCommands[1].first /*CommandType*/, CommandType::KERNEL); - EXPECT_EQ(ExecutedCommands[1].second /*EventsCount*/, 0u); -} \ No newline at end of file + ASSERT_EQ(ExecutedCommands.size(), 2u); + EXPECT_EQ(ExecutedCommands[0].first /*CommandType*/, CommandType::MEMSET); + EXPECT_EQ(ExecutedCommands[0].second /*EventsCount*/, 0u); + EXPECT_EQ(ExecutedCommands[1].first /*CommandType*/, CommandType::KERNEL); + EXPECT_EQ(ExecutedCommands[1].second /*EventsCount*/, 0u); + } +} diff --git a/sycl/unittests/xpti_trace/QueueIDCheck.cpp b/sycl/unittests/xpti_trace/QueueIDCheck.cpp index 43d113c2eea3c..56fff8268cee4 100644 --- a/sycl/unittests/xpti_trace/QueueIDCheck.cpp +++ b/sycl/unittests/xpti_trace/QueueIDCheck.cpp @@ -140,7 +140,7 @@ TEST_F(QueueID, QueueCreationUSMOperations) { sycl::queue Q0; auto Queue0ImplPtr = sycl::detail::getSyclObjImpl(Q0); auto QueueIDSTr = std::to_string(Queue0ImplPtr->getQueueID()); - + if (!Q0.get_device().has(aspect::usm_shared_allocations)) return; unsigned char *AllocSrc = (unsigned char *)sycl::malloc_shared(1, Q0); unsigned char *AllocDst = (unsigned char *)sycl::malloc_shared(1, Q0); Q0.memset(AllocSrc, 42, 1).wait(); From 0d50453e95850792273ec54da2c78ccc0344ecc5 Mon Sep 17 00:00:00 2001 From: Lorenc Bushi Date: Wed, 31 Jan 2024 10:49:32 -0800 Subject: [PATCH 12/20] Formatting --- .../Complex/sycl_complex_stream_test.cpp | 3 +- .../discard_events_mixed_calls.cpp | 63 ++++++++++--------- sycl/test-e2e/GroupAlgorithm/root_group.cpp | 6 +- .../InOrderEventsExt/get_last_event.cpp | 3 +- .../test-e2e/Reduction/reduction_internal.cpp | 3 +- sycl/test-e2e/USM/alloc_functions.cpp | 34 +++++----- sycl/unittests/xpti_trace/QueueIDCheck.cpp | 3 +- 7 files changed, 61 insertions(+), 54 deletions(-) diff --git a/sycl/test-e2e/Complex/sycl_complex_stream_test.cpp b/sycl/test-e2e/Complex/sycl_complex_stream_test.cpp index 3fa2e8f3bf772..56480583a3646 100644 --- a/sycl/test-e2e/Complex/sycl_complex_stream_test.cpp +++ b/sycl/test-e2e/Complex/sycl_complex_stream_test.cpp @@ -7,7 +7,8 @@ template struct test_sycl_stream_operator { bool operator()(sycl::queue &Q, cmplx init) { - if (!Q.get_device().has(aspect::usm_shared_allocations)) return true; + if (!Q.get_device().has(aspect::usm_shared_allocations)) + return true; auto *cplx_out = sycl::malloc_shared>(1, Q); cplx_out[0] = experimental::complex(init.re, init.im); diff --git a/sycl/test-e2e/DiscardEvents/discard_events_mixed_calls.cpp b/sycl/test-e2e/DiscardEvents/discard_events_mixed_calls.cpp index cfc4eff222e7a..e4f91471d0469 100644 --- a/sycl/test-e2e/DiscardEvents/discard_events_mixed_calls.cpp +++ b/sycl/test-e2e/DiscardEvents/discard_events_mixed_calls.cpp @@ -37,7 +37,8 @@ static constexpr int MAX_ITER_NUM2 = 10; void TestHelper(sycl::queue Q, const std::function Range, int *Harray, sycl::buffer Buf)> &Function) { - if (!Q.get_device().has(aspect::usm_shared_allocation)) return; + if (!Q.get_device().has(aspect::usm_shared_allocation)) + return; int *Harray = sycl::malloc_shared(BUFFER_SIZE, Q); assert(Harray != nullptr); for (size_t i = 0; i < BUFFER_SIZE; ++i) { @@ -114,36 +115,36 @@ void RunTest_USM_Accessor(sycl::queue Q) { } void RunTest_Accessor_USM(sycl::queue Q) { - TestHelper( - Q, [&](sycl::range<1> Range, int *Harray, sycl::buffer Buf) { - { - sycl::host_accessor HostAcc(Buf); - for (size_t i = 0; i < BUFFER_SIZE; ++i) { - HostAcc[i] = 0; - } - } - - for (int i = 0; i < MAX_ITER_NUM1; ++i) - IfTrueIncrementBufferAndUSM(Q, Range, Harray, Buf, (i)); - - for (int i = 0; i < MAX_ITER_NUM2; ++i) - IfTrueIncrementUSM(Q, Range, Harray, (MAX_ITER_NUM1 + i)); - - Q.wait(); - - // check results - for (size_t i = 0; i < BUFFER_SIZE; ++i) { - int expected = MAX_ITER_NUM1 + MAX_ITER_NUM2; - assert(Harray[i] == expected); - } - { - sycl::host_accessor HostAcc(Buf, sycl::read_only); - for (size_t i = 0; i < BUFFER_SIZE; ++i) { - int expected = MAX_ITER_NUM1; - assert(HostAcc[i] == expected); - } - } - }); + TestHelper(Q, + [&](sycl::range<1> Range, int *Harray, sycl::buffer Buf) { + { + sycl::host_accessor HostAcc(Buf); + for (size_t i = 0; i < BUFFER_SIZE; ++i) { + HostAcc[i] = 0; + } + } + + for (int i = 0; i < MAX_ITER_NUM1; ++i) + IfTrueIncrementBufferAndUSM(Q, Range, Harray, Buf, (i)); + + for (int i = 0; i < MAX_ITER_NUM2; ++i) + IfTrueIncrementUSM(Q, Range, Harray, (MAX_ITER_NUM1 + i)); + + Q.wait(); + + // check results + for (size_t i = 0; i < BUFFER_SIZE; ++i) { + int expected = MAX_ITER_NUM1 + MAX_ITER_NUM2; + assert(Harray[i] == expected); + } + { + sycl::host_accessor HostAcc(Buf, sycl::read_only); + for (size_t i = 0; i < BUFFER_SIZE; ++i) { + int expected = MAX_ITER_NUM1; + assert(HostAcc[i] == expected); + } + } + }); } void RunTest_Mixed(sycl::queue Q) { diff --git a/sycl/test-e2e/GroupAlgorithm/root_group.cpp b/sycl/test-e2e/GroupAlgorithm/root_group.cpp index dc1bb0d85bccb..aa993edb004fe 100644 --- a/sycl/test-e2e/GroupAlgorithm/root_group.cpp +++ b/sycl/test-e2e/GroupAlgorithm/root_group.cpp @@ -33,7 +33,8 @@ void testQueriesAndProperties() { void testRootGroup() { sycl::queue q; - if (!q.get_device().has(aspect::usm_shared_allocations)) return; + if (!q.get_device().has(aspect::usm_shared_allocations)) + return; const auto bundle = sycl::get_kernel_bundle(q.get_context()); const auto kernel = bundle.get_kernel(); @@ -67,7 +68,8 @@ void testRootGroup() { void testRootGroupFunctions() { sycl::queue q; - if (!q.get_device().has(aspect::usm_shared_allocation)) return; + if (!q.get_device().has(aspect::usm_shared_allocation)) + return; const auto bundle = sycl::get_kernel_bundle(q.get_context()); const auto kernel = bundle.get_kernel(); diff --git a/sycl/test-e2e/InOrderEventsExt/get_last_event.cpp b/sycl/test-e2e/InOrderEventsExt/get_last_event.cpp index 176ea5def6291..f4a8682750321 100644 --- a/sycl/test-e2e/InOrderEventsExt/get_last_event.cpp +++ b/sycl/test-e2e/InOrderEventsExt/get_last_event.cpp @@ -34,7 +34,8 @@ int main() { Failed += Check(Q, "host_task", [&]() { return Q.submit([&](sycl::handler &CGH) { CGH.host_task([]() {}); }); }); - if (!Q.get_device().has(aspect::usm_shared_allocations)) return Failed; + if (!Q.get_device().has(aspect::usm_shared_allocations)) + return Failed; constexpr size_t N = 64; int *Data1 = sycl::malloc_shared(N, Q); int *Data2 = sycl::malloc_shared(N, Q); diff --git a/sycl/test-e2e/Reduction/reduction_internal.cpp b/sycl/test-e2e/Reduction/reduction_internal.cpp index a340fcd779d5f..a9de7021a4879 100644 --- a/sycl/test-e2e/Reduction/reduction_internal.cpp +++ b/sycl/test-e2e/Reduction/reduction_internal.cpp @@ -80,7 +80,8 @@ static void test(RedStorage &Storage, RangeTy Range) { cgh, Range, ext::oneapi::experimental::empty_properties_t{}, RedSycl, [=](auto Item, auto &Red) { Red.combine(T{1}); }); }).wait(); - if (!q.get_device().has(aspect::usm_shared_allocations)) return; + if (!q.get_device().has(aspect::usm_shared_allocations)) + return; auto *Result = malloc_shared(1, q); q.submit([&](handler &cgh) { auto RedAcc = GetRedAcc(cgh); diff --git a/sycl/test-e2e/USM/alloc_functions.cpp b/sycl/test-e2e/USM/alloc_functions.cpp index 278140a83b705..d60b7151896f5 100644 --- a/sycl/test-e2e/USM/alloc_functions.cpp +++ b/sycl/test-e2e/USM/alloc_functions.cpp @@ -85,16 +85,16 @@ int main() { [&]() { return MHost(ctx, property_list{}); }}); if (q.get_device().has(aspect::usm_shared_allocations)) { - auto MShared = [&](auto... args) { - return malloc_shared(sizeof(std::max_align_t), args...); - }; - - CheckAll(FAlign, - std::tuple{[&]() { return MShared(q); }, - [&]() { return MShared(d, ctx); }, - [&]() { return MShared(q, property_list{}); }, - [&]() { return MShared(d, ctx, property_list{}); }}); -} + auto MShared = [&](auto... args) { + return malloc_shared(sizeof(std::max_align_t), args...); + }; + + CheckAll(FAlign, + std::tuple{[&]() { return MShared(q); }, + [&]() { return MShared(d, ctx); }, + [&]() { return MShared(q, property_list{}); }, + [&]() { return MShared(d, ctx, property_list{}); }}); + } auto ADevice = [&](size_t Align, auto... args) { return aligned_alloc_device(Align, sizeof(std::max_align_t), args...); @@ -153,13 +153,13 @@ int main() { CheckAll(Align, std::tuple{[&]() { return THost(q); }, [&]() { return THost(ctx); }}); - if (q.get_device().has(aspect::usm_shared_allocations)) { -auto TShared = [&](auto... args) { - return malloc_shared(1, args...); - }; - CheckAll(Align, std::tuple{[&]() { return TShared(q); }, - [&]() { return TShared(d, ctx); }}); -} + if (q.get_device().has(aspect::usm_shared_allocations)) { + auto TShared = [&](auto... args) { + return malloc_shared(1, args...); + }; + CheckAll(Align, std::tuple{[&]() { return TShared(q); }, + [&]() { return TShared(d, ctx); }}); + } auto ATDevice = [&](size_t Align, auto... args) { return aligned_alloc_device(Align, 1, args...); diff --git a/sycl/unittests/xpti_trace/QueueIDCheck.cpp b/sycl/unittests/xpti_trace/QueueIDCheck.cpp index 56fff8268cee4..74f85b8c9dbc7 100644 --- a/sycl/unittests/xpti_trace/QueueIDCheck.cpp +++ b/sycl/unittests/xpti_trace/QueueIDCheck.cpp @@ -140,7 +140,8 @@ TEST_F(QueueID, QueueCreationUSMOperations) { sycl::queue Q0; auto Queue0ImplPtr = sycl::detail::getSyclObjImpl(Q0); auto QueueIDSTr = std::to_string(Queue0ImplPtr->getQueueID()); - if (!Q0.get_device().has(aspect::usm_shared_allocations)) return; + if (!Q0.get_device().has(aspect::usm_shared_allocations)) + return; unsigned char *AllocSrc = (unsigned char *)sycl::malloc_shared(1, Q0); unsigned char *AllocDst = (unsigned char *)sycl::malloc_shared(1, Q0); Q0.memset(AllocSrc, 42, 1).wait(); From aa87774c898343fd7c404fb9dabbaf68ad798ec7 Mon Sep 17 00:00:00 2001 From: Lorenc Bushi Date: Wed, 31 Jan 2024 12:29:46 -0800 Subject: [PATCH 13/20] Fix compilation error --- .../scheduler/InOrderQueueHostTaskDeps.cpp | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/sycl/unittests/scheduler/InOrderQueueHostTaskDeps.cpp b/sycl/unittests/scheduler/InOrderQueueHostTaskDeps.cpp index f797e6bb9ae4f..a8feb5311118a 100644 --- a/sycl/unittests/scheduler/InOrderQueueHostTaskDeps.cpp +++ b/sycl/unittests/scheduler/InOrderQueueHostTaskDeps.cpp @@ -106,11 +106,11 @@ TEST_F(SchedulerTest, InOrderQueueCrossDeps) { CGH.single_task>([] {}); }); - { - std::unique_lock lk(CvMutex); - ready = true; - } - Cv.notify_one(); + { + std::unique_lock lk(CvMutex); + ready = true; + } + Cv.notify_one(); InOrderQueue.wait(); @@ -156,17 +156,17 @@ TEST_F(SchedulerTest, InOrderQueueCrossDepsShortcutFuncs) { event Ev2 = InOrderQueue.single_task>([] {}); - { - std::unique_lock lk(CvMutex); - ready = true; - } - Cv.notify_one(); + { + std::unique_lock lk(CvMutex); + ready = true; + } + Cv.notify_one(); InOrderQueue.wait(); - ASSERT_EQ(ExecutedCommands.size(), 2u); - EXPECT_EQ(ExecutedCommands[0].first /*CommandType*/, CommandType::MEMSET); - EXPECT_EQ(ExecutedCommands[0].second /*EventsCount*/, 0u); - EXPECT_EQ(ExecutedCommands[1].first /*CommandType*/, CommandType::KERNEL); - EXPECT_EQ(ExecutedCommands[1].second /*EventsCount*/, 0u); -} + ASSERT_EQ(ExecutedCommands.size(), 2u); + EXPECT_EQ(ExecutedCommands[0].first /*CommandType*/, CommandType::MEMSET); + EXPECT_EQ(ExecutedCommands[0].second /*EventsCount*/, 0u); + EXPECT_EQ(ExecutedCommands[1].first /*CommandType*/, CommandType::KERNEL); + EXPECT_EQ(ExecutedCommands[1].second /*EventsCount*/, 0u); + } From 803fb59daee67d3f4aec27a6aba01d2b15d624af Mon Sep 17 00:00:00 2001 From: Lorenc Bushi Date: Wed, 31 Jan 2024 13:25:41 -0800 Subject: [PATCH 14/20] Fix compilation error --- sycl/unittests/scheduler/InOrderQueueHostTaskDeps.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/sycl/unittests/scheduler/InOrderQueueHostTaskDeps.cpp b/sycl/unittests/scheduler/InOrderQueueHostTaskDeps.cpp index a8feb5311118a..6b7b9a29cda4e 100644 --- a/sycl/unittests/scheduler/InOrderQueueHostTaskDeps.cpp +++ b/sycl/unittests/scheduler/InOrderQueueHostTaskDeps.cpp @@ -170,3 +170,4 @@ TEST_F(SchedulerTest, InOrderQueueCrossDepsShortcutFuncs) { EXPECT_EQ(ExecutedCommands[1].first /*CommandType*/, CommandType::KERNEL); EXPECT_EQ(ExecutedCommands[1].second /*EventsCount*/, 0u); } +} From cd079436c42d3b017b7b254095d94f6cdd9870c4 Mon Sep 17 00:00:00 2001 From: Lorenc Bushi Date: Wed, 31 Jan 2024 14:58:25 -0800 Subject: [PATCH 15/20] Fix errors in tests --- sycl/test-e2e/Complex/sycl_complex_stream_test.cpp | 2 +- sycl/test-e2e/DiscardEvents/discard_events_mixed_calls.cpp | 2 +- sycl/test-e2e/GroupAlgorithm/root_group.cpp | 2 +- sycl/test-e2e/InOrderEventsExt/get_last_event.cpp | 2 +- sycl/test-e2e/Regression/range-rounding-this-id.cpp | 2 +- sycl/test-e2e/USM/alloc_functions.cpp | 6 ++++-- sycl/test-e2e/USM/memcpy.cpp | 2 +- sycl/test-e2e/syclcompat/kernel/Inputs/kernel_function.cpp | 2 +- 8 files changed, 11 insertions(+), 9 deletions(-) diff --git a/sycl/test-e2e/Complex/sycl_complex_stream_test.cpp b/sycl/test-e2e/Complex/sycl_complex_stream_test.cpp index 56480583a3646..c4a45ba4e5884 100644 --- a/sycl/test-e2e/Complex/sycl_complex_stream_test.cpp +++ b/sycl/test-e2e/Complex/sycl_complex_stream_test.cpp @@ -7,7 +7,7 @@ template struct test_sycl_stream_operator { bool operator()(sycl::queue &Q, cmplx init) { - if (!Q.get_device().has(aspect::usm_shared_allocations)) + if (!Q.get_device().has(sycl::aspect::usm_shared_allocations)) return true; auto *cplx_out = sycl::malloc_shared>(1, Q); cplx_out[0] = experimental::complex(init.re, init.im); diff --git a/sycl/test-e2e/DiscardEvents/discard_events_mixed_calls.cpp b/sycl/test-e2e/DiscardEvents/discard_events_mixed_calls.cpp index e4f91471d0469..9d8b8f1935c2e 100644 --- a/sycl/test-e2e/DiscardEvents/discard_events_mixed_calls.cpp +++ b/sycl/test-e2e/DiscardEvents/discard_events_mixed_calls.cpp @@ -37,7 +37,7 @@ static constexpr int MAX_ITER_NUM2 = 10; void TestHelper(sycl::queue Q, const std::function Range, int *Harray, sycl::buffer Buf)> &Function) { - if (!Q.get_device().has(aspect::usm_shared_allocation)) + if (!Q.get_device().has(aspect::usm_shared_allocations)) return; int *Harray = sycl::malloc_shared(BUFFER_SIZE, Q); assert(Harray != nullptr); diff --git a/sycl/test-e2e/GroupAlgorithm/root_group.cpp b/sycl/test-e2e/GroupAlgorithm/root_group.cpp index aa993edb004fe..2392a5f467da9 100644 --- a/sycl/test-e2e/GroupAlgorithm/root_group.cpp +++ b/sycl/test-e2e/GroupAlgorithm/root_group.cpp @@ -68,7 +68,7 @@ void testRootGroup() { void testRootGroupFunctions() { sycl::queue q; - if (!q.get_device().has(aspect::usm_shared_allocation)) + if (!q.get_device().has(aspect::usm_shared_allocations)) return; const auto bundle = sycl::get_kernel_bundle(q.get_context()); diff --git a/sycl/test-e2e/InOrderEventsExt/get_last_event.cpp b/sycl/test-e2e/InOrderEventsExt/get_last_event.cpp index f4a8682750321..aeb4ab44acb49 100644 --- a/sycl/test-e2e/InOrderEventsExt/get_last_event.cpp +++ b/sycl/test-e2e/InOrderEventsExt/get_last_event.cpp @@ -34,7 +34,7 @@ int main() { Failed += Check(Q, "host_task", [&]() { return Q.submit([&](sycl::handler &CGH) { CGH.host_task([]() {}); }); }); - if (!Q.get_device().has(aspect::usm_shared_allocations)) + if (!Q.get_device().has(sycl::aspect::usm_shared_allocations)) return Failed; constexpr size_t N = 64; int *Data1 = sycl::malloc_shared(N, Q); diff --git a/sycl/test-e2e/Regression/range-rounding-this-id.cpp b/sycl/test-e2e/Regression/range-rounding-this-id.cpp index 5fbf3ee3999a0..1296dbf557f0c 100644 --- a/sycl/test-e2e/Regression/range-rounding-this-id.cpp +++ b/sycl/test-e2e/Regression/range-rounding-this-id.cpp @@ -1,4 +1,4 @@ -// REQUIRE: usm_shared_allocations +// REQUIRES: usm_shared_allocations // This test ensures that this_id returns the correct value // even when a kernel is wrapped in a range rounding kernel. // RUN: %{build} -o %t.out diff --git a/sycl/test-e2e/USM/alloc_functions.cpp b/sycl/test-e2e/USM/alloc_functions.cpp index d60b7151896f5..6ce81372a7cbf 100644 --- a/sycl/test-e2e/USM/alloc_functions.cpp +++ b/sycl/test-e2e/USM/alloc_functions.cpp @@ -84,7 +84,8 @@ int main() { [&]() { return MHost(q, property_list{}); }, [&]() { return MHost(ctx, property_list{}); }}); - if (q.get_device().has(aspect::usm_shared_allocations)) { + if (d.has(aspect::usm_shared_allocations) && + q.get_device().has(aspect::usm_shared_allocations)) { auto MShared = [&](auto... args) { return malloc_shared(sizeof(std::max_align_t), args...); }; @@ -153,7 +154,8 @@ int main() { CheckAll(Align, std::tuple{[&]() { return THost(q); }, [&]() { return THost(ctx); }}); - if (q.get_device().has(aspect::usm_shared_allocations)) { + if (d.has(aspect::usm_shared_allocations) && + q.get_device().has(aspect::usm_shared_allocations)) { auto TShared = [&](auto... args) { return malloc_shared(1, args...); }; diff --git a/sycl/test-e2e/USM/memcpy.cpp b/sycl/test-e2e/USM/memcpy.cpp index c7ae134258dc1..7653617b493f8 100644 --- a/sycl/test-e2e/USM/memcpy.cpp +++ b/sycl/test-e2e/USM/memcpy.cpp @@ -279,7 +279,7 @@ int main() { TEST_MEMCPY(inArray, init_on_host, outArray, check_on_device) } - if (dev.get_info() && + if (dev.get_info() && dev.get_info()) { // Test shared to device USM_MALLOC(inArray, shared) diff --git a/sycl/test-e2e/syclcompat/kernel/Inputs/kernel_function.cpp b/sycl/test-e2e/syclcompat/kernel/Inputs/kernel_function.cpp index 1a54c0acdc0c8..d6d2639ea6fba 100644 --- a/sycl/test-e2e/syclcompat/kernel/Inputs/kernel_function.cpp +++ b/sycl/test-e2e/syclcompat/kernel/Inputs/kernel_function.cpp @@ -29,7 +29,7 @@ // // // ===---------------------------------------------------------------------===// - +// REQUIRES: usm_shared_allocations #ifdef _WIN32 #include #else From b3ad06d2e1bc1bd353ebb873b7d00305411923bc Mon Sep 17 00:00:00 2001 From: Lorenc Bushi Date: Wed, 31 Jan 2024 15:49:19 -0800 Subject: [PATCH 16/20] Fix compilation issues --- sycl/test-e2e/GroupAlgorithm/root_group.cpp | 4 +- sycl/test-e2e/USM/alloc_functions.cpp | 54 ++++++++++--------- sycl/test-e2e/USM/memcpy.cpp | 2 +- .../kernel/Inputs/kernel_function.cpp | 3 +- 4 files changed, 34 insertions(+), 29 deletions(-) diff --git a/sycl/test-e2e/GroupAlgorithm/root_group.cpp b/sycl/test-e2e/GroupAlgorithm/root_group.cpp index 2392a5f467da9..81c196a6d16e0 100644 --- a/sycl/test-e2e/GroupAlgorithm/root_group.cpp +++ b/sycl/test-e2e/GroupAlgorithm/root_group.cpp @@ -33,7 +33,7 @@ void testQueriesAndProperties() { void testRootGroup() { sycl::queue q; - if (!q.get_device().has(aspect::usm_shared_allocations)) + if (!q.get_device().has(sycl::aspect::usm_shared_allocations)) return; const auto bundle = sycl::get_kernel_bundle(q.get_context()); @@ -68,7 +68,7 @@ void testRootGroup() { void testRootGroupFunctions() { sycl::queue q; - if (!q.get_device().has(aspect::usm_shared_allocations)) + if (!q.get_device().has(sycl::aspect::usm_shared_allocations)) return; const auto bundle = sycl::get_kernel_bundle(q.get_context()); diff --git a/sycl/test-e2e/USM/alloc_functions.cpp b/sycl/test-e2e/USM/alloc_functions.cpp index 6ce81372a7cbf..3694fd5342368 100644 --- a/sycl/test-e2e/USM/alloc_functions.cpp +++ b/sycl/test-e2e/USM/alloc_functions.cpp @@ -128,21 +128,25 @@ int main() { [&]() { return AHost(Align, q, property_list{}); }, [&]() { return AHost(Align, ctx, property_list{}); }}); - auto AShared = [&](size_t Align, auto... args) { - return aligned_alloc_shared(Align, sizeof(std::max_align_t), args...); - }; - CheckAll(FAlign, - std::tuple{ - [&]() { return AShared(FAlign / 2, q); }, - [&]() { return AShared(FAlign / 2, d, ctx); }, - [&]() { return AShared(FAlign / 2, q, property_list{}); }, - [&]() { return AShared(FAlign / 2, d, ctx, property_list{}); }}); - CheckAll( - Align, - std::tuple{[&]() { return AShared(Align, q); }, - [&]() { return AShared(Align, d, ctx); }, - [&]() { return AShared(Align, q, property_list{}); }, - [&]() { return AShared(Align, d, ctx, property_list{}); }}); + if (q.get_device().has(aspect::usm_device_allocations) && + d.has(aspect::usm_device_allocations)) { + auto AShared = [&](size_t Align, auto... args) { + return aligned_alloc_shared(Align, sizeof(std::max_align_t), args...); + }; + CheckAll( + FAlign, + std::tuple{ + [&]() { return AShared(FAlign / 2, q); }, + [&]() { return AShared(FAlign / 2, d, ctx); }, + [&]() { return AShared(FAlign / 2, q, property_list{}); }, + [&]() { return AShared(FAlign / 2, d, ctx, property_list{}); }}); + CheckAll( + Align, + std::tuple{[&]() { return AShared(Align, q); }, + [&]() { return AShared(Align, d, ctx); }, + [&]() { return AShared(Align, q, property_list{}); }, + [&]() { return AShared(Align, d, ctx, property_list{}); }}); + } auto TDevice = [&](auto... args) { return malloc_device(1, args...); @@ -179,15 +183,17 @@ int main() { [&]() { return ATHost(Align / 2, ctx); }}); CheckAll(Align * 2, std::tuple{[&]() { return ATHost(Align * 2, q); }, [&]() { return ATHost(Align * 2, ctx); }}); - - auto ATShared = [&](size_t Align, auto... args) { - return aligned_alloc_shared(Align, 1, args...); - }; - CheckAll(Align, std::tuple{[&]() { return ATShared(Align / 2, q); }, - [&]() { return ATShared(Align / 2, d, ctx); }}); - CheckAll(Align * 2, - std::tuple{[&]() { return ATShared(Align * 2, q); }, - [&]() { return ATShared(Align * 2, d, ctx); }}); + if (q.get_device().has(aspect::usm_device_allocations) && + d.has(aspect::usm_device_allocations)) { + auto ATShared = [&](size_t Align, auto... args) { + return aligned_alloc_shared(Align, 1, args...); + }; + CheckAll(Align, std::tuple{[&]() { return ATShared(Align / 2, q); }, + [&]() { return ATShared(Align / 2, d, ctx); }}); + CheckAll(Align * 2, + std::tuple{[&]() { return ATShared(Align * 2, q); }, + [&]() { return ATShared(Align * 2, d, ctx); }}); + } auto Malloc = [&](auto... args) { return malloc(sizeof(std::max_align_t), args...); diff --git a/sycl/test-e2e/USM/memcpy.cpp b/sycl/test-e2e/USM/memcpy.cpp index 7653617b493f8..c2c5e9023beb1 100644 --- a/sycl/test-e2e/USM/memcpy.cpp +++ b/sycl/test-e2e/USM/memcpy.cpp @@ -175,7 +175,7 @@ int main() { TEST_MEMCPY(inArray, init_on_device, outArray, check_on_device) // Test device to aligned device - USM_MALLOC(inArray, shared) + USM_MALLOC(inArray, device) USM_ALIGNED_ALLOC_DEVICE(outArray) TEST_MEMCPY(inArray, init_on_device, outArray, check_on_device) diff --git a/sycl/test-e2e/syclcompat/kernel/Inputs/kernel_function.cpp b/sycl/test-e2e/syclcompat/kernel/Inputs/kernel_function.cpp index d6d2639ea6fba..036e5fed6d49d 100644 --- a/sycl/test-e2e/syclcompat/kernel/Inputs/kernel_function.cpp +++ b/sycl/test-e2e/syclcompat/kernel/Inputs/kernel_function.cpp @@ -29,7 +29,6 @@ // // // ===---------------------------------------------------------------------===// -// REQUIRES: usm_shared_allocations #ifdef _WIN32 #include #else @@ -110,7 +109,7 @@ void test_kernel_functor_ptr() { int sharedSize = 10; void **param = nullptr, **extra = nullptr; - + if (!q_ct1->get_device().has(sycl::aspect::usm_shared_allocations) return; int *dev = sycl::malloc_shared(16, *q_ct1); for (int i = 0; i < 16; i++) { dev[i] = 0; From 310132bc7d99b8b0b4d4e20446fa641574b8a9af Mon Sep 17 00:00:00 2001 From: Lorenc Bushi Date: Thu, 1 Feb 2024 07:22:35 -0800 Subject: [PATCH 17/20] Fix compilation errors --- sycl/test-e2e/USM/alloc_functions.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sycl/test-e2e/USM/alloc_functions.cpp b/sycl/test-e2e/USM/alloc_functions.cpp index 3694fd5342368..123d7a0e5206f 100644 --- a/sycl/test-e2e/USM/alloc_functions.cpp +++ b/sycl/test-e2e/USM/alloc_functions.cpp @@ -128,8 +128,8 @@ int main() { [&]() { return AHost(Align, q, property_list{}); }, [&]() { return AHost(Align, ctx, property_list{}); }}); - if (q.get_device().has(aspect::usm_device_allocations) && - d.has(aspect::usm_device_allocations)) { + if (q.get_device().has(aspect::usm_shared_allocations) && + d.has(aspect::usm_shared_allocations)) { auto AShared = [&](size_t Align, auto... args) { return aligned_alloc_shared(Align, sizeof(std::max_align_t), args...); }; @@ -183,8 +183,8 @@ int main() { [&]() { return ATHost(Align / 2, ctx); }}); CheckAll(Align * 2, std::tuple{[&]() { return ATHost(Align * 2, q); }, [&]() { return ATHost(Align * 2, ctx); }}); - if (q.get_device().has(aspect::usm_device_allocations) && - d.has(aspect::usm_device_allocations)) { + if (q.get_device().has(aspect::usm_shared_allocations) && + d.has(aspect::usm_shared_allocations)) { auto ATShared = [&](size_t Align, auto... args) { return aligned_alloc_shared(Align, 1, args...); }; From bd8d54e27d83e9419bd471e3b7dafa72cf302740 Mon Sep 17 00:00:00 2001 From: Lorenc Bushi Date: Thu, 1 Feb 2024 07:58:13 -0800 Subject: [PATCH 18/20] Fix compilation error --- sycl/test-e2e/syclcompat/kernel/Inputs/kernel_function.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sycl/test-e2e/syclcompat/kernel/Inputs/kernel_function.cpp b/sycl/test-e2e/syclcompat/kernel/Inputs/kernel_function.cpp index 036e5fed6d49d..5bf4cee86b800 100644 --- a/sycl/test-e2e/syclcompat/kernel/Inputs/kernel_function.cpp +++ b/sycl/test-e2e/syclcompat/kernel/Inputs/kernel_function.cpp @@ -109,7 +109,7 @@ void test_kernel_functor_ptr() { int sharedSize = 10; void **param = nullptr, **extra = nullptr; - if (!q_ct1->get_device().has(sycl::aspect::usm_shared_allocations) return; + if (!q_ct1->get_device().has(sycl::aspect::usm_shared_allocations)) return; int *dev = sycl::malloc_shared(16, *q_ct1); for (int i = 0; i < 16; i++) { dev[i] = 0; From eae932b42fa8f798f1f15d2b4e9b7373177307ed Mon Sep 17 00:00:00 2001 From: Lorenc Bushi Date: Thu, 1 Feb 2024 08:36:20 -0800 Subject: [PATCH 19/20] Fix failures --- .../kernel/Inputs/kernel_function.cpp | 3 +- .../scheduler/InOrderQueueHostTaskDeps.cpp | 77 +++++++++---------- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/sycl/test-e2e/syclcompat/kernel/Inputs/kernel_function.cpp b/sycl/test-e2e/syclcompat/kernel/Inputs/kernel_function.cpp index 5bf4cee86b800..409bb8603adba 100644 --- a/sycl/test-e2e/syclcompat/kernel/Inputs/kernel_function.cpp +++ b/sycl/test-e2e/syclcompat/kernel/Inputs/kernel_function.cpp @@ -109,7 +109,8 @@ void test_kernel_functor_ptr() { int sharedSize = 10; void **param = nullptr, **extra = nullptr; - if (!q_ct1->get_device().has(sycl::aspect::usm_shared_allocations)) return; + if (!q_ct1->get_device().has(sycl::aspect::usm_shared_allocations)) + return; int *dev = sycl::malloc_shared(16, *q_ct1); for (int i = 0; i < 16; i++) { dev[i] = 0; diff --git a/sycl/unittests/scheduler/InOrderQueueHostTaskDeps.cpp b/sycl/unittests/scheduler/InOrderQueueHostTaskDeps.cpp index 6b7b9a29cda4e..ce2782d7f3f26 100644 --- a/sycl/unittests/scheduler/InOrderQueueHostTaskDeps.cpp +++ b/sycl/unittests/scheduler/InOrderQueueHostTaskDeps.cpp @@ -40,7 +40,8 @@ TEST_F(SchedulerTest, InOrderQueueHostTaskDeps) { context Ctx{Plt}; queue InOrderQueue{Ctx, default_selector_v, property::queue::in_order()}; - + if (!InOrderQueue.get_device().has(aspect::usm_shared_allocations)) + return; auto buf = sycl::malloc_shared(1, InOrderQueue); event Evt = InOrderQueue.submit( [&](sycl::handler &CGH) { CGH.memset(buf, 0, sizeof(buf[0])); }); @@ -80,7 +81,8 @@ TEST_F(SchedulerTest, InOrderQueueCrossDeps) { context Ctx{Plt}; queue InOrderQueue{Ctx, default_selector_v, property::queue::in_order()}; - + if (!InOrderQueue.get_device().has(aspect::usm_shared_allocations)) + return; kernel_bundle KernelBundle = sycl::get_kernel_bundle(Ctx); auto ExecBundle = sycl::build(KernelBundle); @@ -95,31 +97,29 @@ TEST_F(SchedulerTest, InOrderQueueCrossDeps) { Cv.wait(lk, [&ready] { return ready; }); }); }); - if (InOrderQueue.get_device().has(aspect::usm_shared_allocations)) { - auto buf = sycl::malloc_shared(1, InOrderQueue); + auto buf = sycl::malloc_shared(1, InOrderQueue); - event Ev1 = InOrderQueue.submit( - [&](sycl::handler &CGH) { CGH.memset(buf, 0, sizeof(buf[0])); }); + event Ev1 = InOrderQueue.submit( + [&](sycl::handler &CGH) { CGH.memset(buf, 0, sizeof(buf[0])); }); - event Ev2 = InOrderQueue.submit([&](sycl::handler &CGH) { - CGH.use_kernel_bundle(ExecBundle); - CGH.single_task>([] {}); - }); + event Ev2 = InOrderQueue.submit([&](sycl::handler &CGH) { + CGH.use_kernel_bundle(ExecBundle); + CGH.single_task>([] {}); + }); - { - std::unique_lock lk(CvMutex); - ready = true; - } - Cv.notify_one(); + { + std::unique_lock lk(CvMutex); + ready = true; + } + Cv.notify_one(); - InOrderQueue.wait(); + InOrderQueue.wait(); - ASSERT_EQ(ExecutedCommands.size(), 2u); - EXPECT_EQ(ExecutedCommands[0].first /*CommandType*/, CommandType::MEMSET); - EXPECT_EQ(ExecutedCommands[0].second /*EventsCount*/, 0u); - EXPECT_EQ(ExecutedCommands[1].first /*CommandType*/, CommandType::KERNEL); - EXPECT_EQ(ExecutedCommands[1].second /*EventsCount*/, 0u); - } + ASSERT_EQ(ExecutedCommands.size(), 2u); + EXPECT_EQ(ExecutedCommands[0].first /*CommandType*/, CommandType::MEMSET); + EXPECT_EQ(ExecutedCommands[0].second /*EventsCount*/, 0u); + EXPECT_EQ(ExecutedCommands[1].first /*CommandType*/, CommandType::KERNEL); + EXPECT_EQ(ExecutedCommands[1].second /*EventsCount*/, 0u); } TEST_F(SchedulerTest, InOrderQueueCrossDepsShortcutFuncs) { @@ -138,7 +138,8 @@ TEST_F(SchedulerTest, InOrderQueueCrossDepsShortcutFuncs) { context Ctx{Plt}; queue InOrderQueue{Ctx, default_selector_v, property::queue::in_order()}; - + if (!InOrderQueue.get_device().has(aspect::usm_shared_allocations)) + return; std::mutex CvMutex; std::condition_variable Cv; bool ready = false; @@ -149,25 +150,23 @@ TEST_F(SchedulerTest, InOrderQueueCrossDepsShortcutFuncs) { Cv.wait(lk, [&ready] { return ready; }); }); }); - if (InOrderQueue.get_device().has(aspect::usm_shared_allocations)) { - auto buf = sycl::malloc_shared(1, InOrderQueue); + auto buf = sycl::malloc_shared(1, InOrderQueue); - event Ev1 = InOrderQueue.memset(buf, 0, sizeof(buf[0])); + event Ev1 = InOrderQueue.memset(buf, 0, sizeof(buf[0])); - event Ev2 = InOrderQueue.single_task>([] {}); + event Ev2 = InOrderQueue.single_task>([] {}); - { - std::unique_lock lk(CvMutex); - ready = true; - } - Cv.notify_one(); + { + std::unique_lock lk(CvMutex); + ready = true; + } + Cv.notify_one(); - InOrderQueue.wait(); + InOrderQueue.wait(); - ASSERT_EQ(ExecutedCommands.size(), 2u); - EXPECT_EQ(ExecutedCommands[0].first /*CommandType*/, CommandType::MEMSET); - EXPECT_EQ(ExecutedCommands[0].second /*EventsCount*/, 0u); - EXPECT_EQ(ExecutedCommands[1].first /*CommandType*/, CommandType::KERNEL); - EXPECT_EQ(ExecutedCommands[1].second /*EventsCount*/, 0u); - } + ASSERT_EQ(ExecutedCommands.size(), 2u); + EXPECT_EQ(ExecutedCommands[0].first /*CommandType*/, CommandType::MEMSET); + EXPECT_EQ(ExecutedCommands[0].second /*EventsCount*/, 0u); + EXPECT_EQ(ExecutedCommands[1].first /*CommandType*/, CommandType::KERNEL); + EXPECT_EQ(ExecutedCommands[1].second /*EventsCount*/, 0u); } From b0d3bdcd3c721a7ff545f3f0aaf1911b61f2c80b Mon Sep 17 00:00:00 2001 From: Lorenc Bushi Date: Fri, 2 Feb 2024 07:45:18 -0800 Subject: [PATCH 20/20] Remove rogue binary file --- .../Annotated_arg_ptr/annotated_arg.out | Bin 163152 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 sycl/test-e2e/Annotated_arg_ptr/annotated_arg.out diff --git a/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.out b/sycl/test-e2e/Annotated_arg_ptr/annotated_arg.out deleted file mode 100755 index 90cd7da3f56d8a680c6e3042cacf8230933f8e1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163152 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

;-=(_-_8s zLB&jbH~abEPp05kgFiQd{WH4z+WcZ0_<1S#gW&g{c{!Z|djjzx&8aW$uZ(@2Y=uO_pYjbn0;7`FmlEAXB&CPECf2iAi z?6)2KQSjaDzXE=+$31+ngWm`~#ibel+SnoceUk4Mf3$-mn!VEG=@syU;MdsrRi^&e!5;uWVAJn6 z^=G5gIeKF}9q$02>y5q z`&Hmif$vs6TA6>T?tZW3{uc0!TinM++riHT|9ahirkwm2;RnAF{G~eoR!jfu;L~1A zH~(d$;HKg)WWL+nP8ImU6#84!@VBJlZ)d*S+|(=J`%}38dK!KKCPh;%u7XMqoAG*!G{@xD$2>5R9zryyB&8_-P77x*Wy`IK?HYz@H zA4?>b{c0=!ECfH8!v9ri_^r%;O4qOTUABOqd!~E*Y-he(-|!Xiy(#R!4!-B-@4C)C zleaQ%3f77pfJbMI7x|4WwGWVrCjE>(@5X%>;GEO$4U5e-BDdUUp(FinjO{Tz$5=R0N;x~EzK!q zKd13C@3i@U3*;Kn_k5bQ&D~naEx4HdH&2su_%8;z zA;^h%S*Xc5;$;|eZ3V2aSd(+;dj)dSUY4tJm!tiEc};QBBSf&x;_pCnFx;fP9lZ zpvh%jNPQ_0gXF(@$ayN_@$IDV5iPu#k18<{-hRlvlZiPu(zi|5mu1tp9dZNE_X6qL zuIqc)rf)aty9{fbr0+#dF6$&yp9ebLgq;8VT;5*S8sb}Xk(z|zwD#X|AZXXd)ckJ9IfA4a*H6hV>!;) zk-jau+)|rdJ>-U}(VrxJk7#mPXPfCj@z)Qzbt`aYh4k&ze zJ;Rz@738KN_YBGH(d05eZ3=q8YlmEQLp=Ujl6ym!`$x#hHe(1f3q$dEC(3U2K20X; zx-6xP;_gMr(R{PWd-FP6^WGHX9%<#gm#@oNd5`>-1NVn9|0n!btjkHik<22e;VlWZjW*;=g2M zJ(h6?B5pYIry0*?83WmK2WDlBXU~6dR@Tq5(QA5j)&+ovkD5Dtbk^ii^PfIC>kmf( z{y#_00{oGjxp&RZdO2tQw%J*GayG$Bvq}2LbLRf|n5>76ng6?EvYt8y(w~?c&jkL; z@pE6v&DxSX|7W>bAIk-P-wCAUsT1Ztbz;`PoG|~z6SMZ60C@UDg6}zL?mhFezI)RA zPt42u=aT^cWL_8GH|EcM9Sr06jKeZrh`vSn* zP9^w@r_TN2X<7ey>im~a%ew0{z<)mNSqkT#yt#YM$l7+s{C_*+IqKXE3Bf91@% zUpXu5&u7lxeOA`cS%9~A2!7l%_wlo{e(jn6g|oB%%LDjd&i*3>=ywa}{^4BXJ2hX* zf#KaNiYTTtZlUii#^V`t>GH&eS(}X}41!@k)@VeXGVAUPBfOFXktWAx%(`sWy%}_= z2b;4O%*tmY**S?WXuM|j7cz|vx#O9}jngCvJlFUP-aeBt=Vuwlvl$-}*nGNVrh3jD znZ|t?v(S%uDC2jmH=Z&3vI`%8yLF~Jvo@UixfJf^6wX>=lp(Xgt(?+1^@bkktt$O9R-pp%7XgyP*9r-=8G*}cY^*>}RfR|+|jal~^@apnr6 zl)^~7qFJ?O8j$&Yvo5ol^)zz2=hU6deEyupHht;b%bRt%DNp%o4UXH-x!Je|*$8QJ z99@`NRkJMv>5demFkFyvw((KK<3}@Qe>EfH@r-g@(3Elf|IIMo&Y1N?X2zd05QS#m zm`j(V)*OG6h#u&3nvX4?-D9kpjS<6D9Dm3YRda4LR>L2VpR?(hFJ%}X$yh7gj%S=+ zf5L||jgGn7GL2hLLC*a`#G3>k6Y{wJ@KG%TA2TkNakZQFrc7 zGK^d1zn+1-dprA&;;(2{wHE#p?#Y<*&lylV>rWZRa~U_2vr_L8+$B3}t+AZ*ZSkxs zqk`T^NA9ePH66#&g{B`odN9LiMj(`Z6%Pmr{CR@$GW_sz#_@m5Fn*jdjE;?zOBWwj z{7F4dbFT3!^6RUa?|&l8xGM{3C-Urqwjo=2JU?f%>0k1HoXXj>JHk7>Jhmg+#Pe(ndB9F!eK@M$HlS-)IcT znH8+-9xnr+%#S(DPdLn9aG2@-L3(h^RX$$7pkhx0z5Pm>u?<{2d+uE9H$AzM7;n8B@1oaDS$=`YnHa1y9xKgQS`klqwlvRS^Ga5544ajE^VzHj zmObP%B>g966XpF0#F)oyENh786sC3;FhovHN9mc$J2yKxzw>NEX< z6KAvX$26O_oFVya{jW~;U_Le3Q_AVQjOkTO*E8*7dMDFInLf$%1*YF-`Wn;UGku%s zQ9i$L{$!@-F)d}fjOkTO*E8*7dMDFInLf$%1*YF-`Wn;UGku%sQHAV2)AN{?GF`^> zDyHk1_A$Ma>7z`aWcmWrZ!>+3>F=4o&Ge`ucAx2aOiP(AV|o?S^-TMi-pTY)rcW|` zf$6uIzQ*+TOy6dDR582H^gO1eOqVgeis^c$eN69U`Y6*UnZCgE+e}|$`g^8tGd+si zqm!A6%%J^SzI5rOp8PADdpl#j9-ptEsK9%%uU8m-w-y!_c#AJ!*l1~Q>fGSz3wQTK zx;j0+@&a#xcS9uR$#09rqCJ;hatRD=z0CzJT^*OSH~03mMG8wUX>afAC?KhDb74tE zNlDZCme!W$rslGW=CbDEuy=h^Q(;qcMQdwGX<1=Yi5Kf7J)2wFFK!L@MOwn`k>-or zy679;ZVy!t_;PsM$*1}w!^kq$W%&imBmT?p`X!UU2>eXrSi{5dgxP-aQ0dLUZZzLV zWjQAI=n3LS^5Y>t8O1lph<=6sp|+##R{HaOVVGyo_A34PXU4O!jYog}z&LH6(x0ph zGR-q+yOjRW-ROkV_9*?ifN|Omr9ZR>N`$x3FW|?RStu&*dALK>E+1f=wnOR9I>ujd z;2RmI?N0i0E911iNq-(>oVGLR&vwSMH`?(pF+R_Mf0yxv4*XY)7d!B2#;Y87mS{-k z8TAhQWX4+^_yvr|9QfsoZ*kyP02leE(Jz8K%7K0&n_lJ_w2erAo(E3y(I&ruA7?fo6CKb^N z(IJ>;(Do$#Sp{6^Z}AJ*$IO>R2M77eA^&~gBtOFP=dk=~*fdIb)Pcv)U&_E`&(*(^ z`g2)+052pzeUrph|L8LaIN`ZBOZ+L8pL>$TCmi}$qoYFd6AnF_(BUE6Xq9>{VLkVp zEO9U6SSk}w^C=QGROo$isR{4g{nqXCnh(N-puJ;RbzW9&!k@4J(5`U5Lm`BP_Fn$r^-m~dt zoQVXsCE%n#%JL`<;%P!fB*L{x%By;B$%PW1a_FCr2qF1KmREYd%6M+4)Ke|h8y{N4 z@{AwP_-`4HGA_<-gZD?qy{x~0hW^CsqoT=g@u0@FH!m#A7Na@=MOF+0i>5B zU4F|rZST{cw;8AHeEKuTOQv}SZQ;|OGa08Xd-_wzIBn6>pJj~GmOTBrmT}sKr$3#H z)7Crvxt(#^YNtPs0;l*Hb+l6-5Do4;gSOo1PaWg5#ZG@VFiu=FO5M~~&zyq=Q( zGs`ddZz+E?%g?Xia?1EJ#!DFg!ygkFfj##_wSK zEXH#f-^%y|hfCofWxVmvej({$`R5oPXFaDf{vF1r7+3!M0pkOI_6tdsUcX>`h;a|= zq5JVEo(;y)eG<0F^K&li|1Qf1SzfvOufUUyH{S$K`EY{sIjb?=X51+CD@f4Umq~f& zyz*JVX?*H+j888T_{qjQ_u9+dTGpfHt(7Am67utnDTln9|8EiUCmFjO<6P30EWGzZ zo<`q|9B*Wz=W(HDf#IAddrIJ^VMDsz|6c|EKE&J5*Zji%GvYt?8Z$m|m&8>&(p4$P z{48dYap0uK_@R`KFz3I3pN;&v?H!4$^gZozDL=7Q;-|BG4dX)}mH1M|KLz|me%Hxw zS>7`y zjGu&LO%^{v;G}2zE3k-1G}EBeJP{sz(ND0U`U8baBtA4Gah2{*G9LV;#8v$KC-7wM z9)pA<{f$pZ`BUKrJzb1Xf5R`#D&8IgPWfc;O^K^~@@1AEXL%LgxmE1XUr2eCf7%(J z-YIc-Pdr}+p3I*=W%I>*Ero6c}Pi0e3a#oA(a(P_J@|OXpd^`F_sYm`djE#&pz9o?bEPoH{34UGT zxtWr2^eU-8c#Fi9|Ib(W-4ZXB;>In&llk*$md|}j%B%D`XSLKn&G}jBzlU+pKS=ot zGNc3l$#{_K;q%$u+BH&76L8 zj{~I=r?boSye4qG`21uvpEK%ZJm)&_a>h+TerW(s<$Z+P7uEm#w!*o*oWb%JTq)&) z&-ewB$M^?9|A6EBs!@qu-TyAv>}YIE8oMZHd3i`0I@4 zb3C9pi>G9r)IWZgUzm@RuyF*b9y5xUI>i0PE`QwaF4BGX7o$)EImsCFaH{i+Qe^yB9AAdmVd64}RWqit!4@(+3 zyg!%nr7Zs};|A9Q^BI4G@!&uC1@d9WFKUu{rpF|HGUFd*e1g;ECdQv;eEe1^?_qon zIt(HmIUd>=Z)JR%`(uk4|0VEb@i6UzFKbCI|1fZJci<7f&|Jg%pJse~RN{Gz{|xxq zG)mYieS%^xo}|)lWd2;o^104@%lHtdqspJ>gr$D}gMQ(j%7@nhPp1DC zmLK5sRq~$okk3Tv|CQ7ul;Pibz{&p;BNA8rjnxYOk;IX`#S>%PctYZc5%D|@oa!Zm z>s!f%bHJ1N^S@coz%D82lWL5>2I-&NPe{Cq@mGMKn2Gtl5{b`Ze3In{J|=NhUoAyO zqHs-3N*o~<&%MCOpKX7VxR>$I0VjV>IqKnmVm+P#DgQjnuZT$f#)l<-CgU#wPZr)Y zu9xz`ZBky9>u%u5lqMiK}w)7~|7hB(Bo^yNpkKR^n>C=`F@R z4@>;I3`0DZwkP+`tuFWwaEj;LuSq>6QjPH~#s_vv9L|a7_>ScIL%>N-<8~=u$ntl) z$bXOJgP)P|zhU`PI$6&*B(CDN6F8;&JAah8O82j`{OETjuF~ZfjQc++@oyUPIjM{F ze_Y}!o)_#I$K#^X-RaLsJu03X7$4{Q z=X}<43*#f~PZh480#|XuqJsQ8%jbSo>R-;xIX6gmgO5sFh4(7p6s|p7jwBcBzl^{5 zrbJF};C$Rjb zJ<{C?_Rn_4efN>On3v#s<~+tDEbqD7FA(MKGmIM#NL*Z=j4Bb z^NEKoRl3NBUGUAosT_@RI(k{pql|mFzEbtrtX?TU@`7JTUe5A2Gd}&0#Fd`s7$0!7 zUl;Tx4_7yEYB$$$yP3=SKLVWmIl}338RO5m==p&Qe$kDbjvtf$JeT!62Atw^=#LWj zF#ZC|2f4jd>GiI{@09Xqu>68eQvVe9Tb^fpfN{?~QvNu`zXv>7x}U$9!~3k1SM|du z88=>*cwUB7^i#&8?9V#Z{}kq?(J-uSrGKace^0Z*pq85jJxo27pL z{ZfyLx67dK#LQ!GF_^?zy|Ehd6#vt2N?fJ;^{i*)d5M>>g-iOS{@iU6SLJsL zJl-A#PWp{+O8Ge~{}slEUXu9bjQehr@6c0gYj|p&qXYsdAlsXQ7*r#ojMCRg?D_b)UWb? zCF3KnN?fJmAaE5HRxQYPSU$?`p2Ez6k0h7>FmS3*M%X{qEdLyE@=q?u!}}RO4FM;7 zn*FKb=Yxz-as6{K%ijT<^6jR#`~q3P_~%)E^cNB@WPF-&KbJe@|KJ_$pWRa4!}7z7 zk8{3K?a^NtADNW$Dn3`Fzp~zYRF~GkS}ZSM}%b z823Ld@k`jBe_?!JkHnXR0l|-Y4~VIDJnw9ULQp;3vS z&wBPU-uN+ztMD#i!(6$7Vu%e`OfQStv0 z<3rC$T!rhBM<9=UIKcUEA?qIlPVv0s9VxHM(Xk(u`lr4saWBhX$oQxuyq%1DpOx|_ zu>6mep2sA96yujYD)oe@O110pKJ*^q7=a^~^spKJs&kU&?wuFe2r>yCtsj=LepU`svbM z{Rsgle~v#c@myy99ysOOAcsqGu^#;?sek;J5;>0LTN%&&ro=zX_}xl=m&8^5_GQM6 z@7v}7nepfkC0@gNYCbL9op?s#sE)*Q8{@&3B(BosEykxg-cD!vi?&NW(}Pm}9LC!j zkB&a{s)XtvwS_{p3fwAw+uMt&uxE_dgOoX z+i{T}biqIGf`11%g=^}=QnQM;Uo&oeT;g*K`BZ$COGSqYr{8Fl3I2N)lELh5;%^*;-o;w_isP351Tu>N4NlxK0{KUvSj zOA=qqjJBQ0{WAz$qzmUy56kZaPX3&}Q|ft;@iXBu!gJaG7cqVh<0D+psCd{5JXt){ zd|v9A;C4{uw|`JL*Kf6~e;l|NhjKfj>b+mFe3a{%Q(6AJFSxi1ob=HBk@To`wgtFH zAohRVLjHJT{2jkwsP^$=F8W_)e8iD1zX4A1Ha;ZvsCw)Jqsjewy$k+j;6l%RcK=-X z49Dk-5?AH=|1s|8_&iO70{c6@DCLJ9lJY9O8W^8=P2#02|2l9Q7keI&@utSP{|)>^ zmeEP=vr>O_QtCOMnS+e`9q#@Gcrra#JeM5b>4LunoZ`p7Rl2Lc&8p$+X_%}wp0zNYR_q%#sTLf6*CYRf~RNEaJd7t?{(qR>^ok{f!% zyIes}E$(QFbOx?$?+b(i0g@>R z_k}xSfwe2^y`i-$SJxGVd_^r?t>I96S4&e22XX@jj`D`Wn_9xr7*sd6hkXf1VFFT= zfRrR4K5rtFM5-J?KiIHRNQ=UoVx?W3;ihQBR~X(D4R=R65cH;YpEugw1!F7{?y0GZ zmBf0Z?ctgg0r9M^i&ca>DcGUN`kHk;-R^2iBRwJ3v^mrs>50|U`w+_|eNFAXVLh?~ z#j(xNaG)-L7@v8x7beDXVPZ5F7AHh%QE38HoM^EmQGH2bYLq3W8BS<8b4Xcv0#u#| zRV4bWB2micP0VjTUqzBkQQFhn+!2Y@T)Vo?7uw&_@ZQWJ%d8wyoKP@PjMtL4%i5Yc zTie6k0a>O4A(2gcVyyumWywfqABr+%;OIZ#AX=^lmKN5m6_K92BJ!oFh$y+-OVwYgaQakDsA6TM74;R# zq8>G6Ak-HKtf@~HccRj&i}{K}%Q*Hz%}qUFUr}fYNT{Q!vuQ)P8(B3?C0>{|?h60s z9- zDnxwtb!`lztE9&v*hk`UW^w5AA`-dg3)nIuqV&oTYRmG_Dp@gxs6QsUpGn#!(e@vy zTUXc3tS+Fe+tMAzNW-lXKwOqZI%DAt-57ARbanQ`nmS`O&9%+GK$6~nap94=SdNuu z7XN6oR)sc%W1%QUZZUMz>=g(i6Y=lGzz+Sijp(G+^r17Ard#m0*`=C6Z`P-G3s#7p z>S~OWYSty`%AzN`B2*O>gRHuG)ty}NXlY zsz#wJ))wyOnho_GWl~!&R4dL$N;A)d(5R7$bJ_^`-`E1IUYR&K)Y2ZP3yQpB_Ab;U z&fnl{S)ZDy;iizvL_)X3_RDmH36F8->M?9#=PZH$^c9vnj$@_aGw0j1kl0$^*VKOq)|*BxudU>j5|jM=`yg zG-LRDb+NAQaIMG@&Op{id;!et^^s-g)V8lA$#gX4&h^}vHbH!aNRePucT-1IxThr$ zIRM+Mdpm@J9wcg_9}}ndeVEMG{ix!;w6`cTT0m|Nr6c8ik>wN!cV24 z!0P0lT3SdmHEMd-whFdV>uGehh9a?WM~w_az*-Db(S6vwj;b=b&uLW(Ws=Hd9QNc|>Y7~c%R421vtdfP+_G|}%PoaTHk1?=mQq4v z24cpw;(MlY3D(sdz$D*c&zkNviEa5Nd8u<t%KB^4Ok?Y-QinZYDKZzjYK}?d!|ogR zAqi%1sj9)2KYLX}h18rWQ8O16-MyW1h;=o-pVQSFTim_DHVRIdC+Un~duySzBWK2{ zn|h?NT5d6fiuxMNny5{!<|M4>Ch?Gr<`b~L7@id|mxziPhqaN&+Le)DLPVu7B#QC$L(*2({NWP2t?_?81lCl2Elv_tg3b+tl*fHA@!PhC(=m z6RHW>4!4E$!)@2r*J&|#*jtuV16!LgtNd zdgwc!(MWsPmERue+z2KewZmCS-8n^xJ+@DTL#@3X z9h+fAGs%N5x@ai0Z0+Jz7@4iE3Sn+7w0!lIp+Gf*)m3YaP}Mc77q6;WYJ|8NTeECg zU7$Wxzj#UQelMiSg~KwM#KR!MzOy^Htj`*$`-$E_3r_!rXaO0s8pR?#p#0GK8ixs~OWD*ej%tSk zL4>7)V!h8B>MSe{S#e)jgu?|`bVu~irX!TI?ohb9yQ{m(YX;ozH)O$dQ6XZF4mkTL zQs{s~eKf?L>FU<>hLR>t84jAn(BuVbS675W8#;UG)H`Abo8mU&s6>0DWpkjAmeZvs zO{S2ZfMrYyB3Lo4r&behNB(kcSag$39<*TdK(iXCMR2sD7Q%nwOg^(uU>Q;&DXBJ*x z5uA?U>^o-x>~%w?u`+AeDix3r_k)L=;lcuPC-pMp@X zYa>`%BP%WKoKj`$ySi^|>Ta#UVnkql6dT!u&*?e^TVI$Iidz;^oonV9Lu72d^@ywu zF2kIul~RZ_`j|O28^!zIY*bjwPK!meu|!o<-cWV8sa003wH@9-(B>pvDdBV0;s!-w4TN7k98L(D#4G`hsn&8S7YV&+0*hqs@f2h^DT|!LzN?If9 z*P|l=!H~Q*L2e$56_$2mQo5^y&#}-h9JY+hHS`Q^<}ItNQuWV;x*jK8t?(r_$w^fm zaIx1aT(mU3osk=;k>M@LW}bENaR6~t+!|ir)Y~3IZlwNFjo5?7GqwcCinlI?&2_HL zJmT7=XMi4$HzW>JQ5FoY~@M&^jH>@sULVpJ`=ST!rR>FA(1mnv|ERi0v>X#}W~=%p%pE=G?`sxX>{aJ(a$jFsgiV*>S9H-uajEx6*Fkc-3pV) z*}fuiJ5mUZ4_%&AvksZtx-tocggQRFon>vE)uTu{1TfQ7++QUcL1ZiL@S723N?FbK z{&lrczlb4m%^D1VTO*wzoU>`QC10TzgQE?dbQPDDB!P~@ks4M}QvtJgZOdAEyV2W0 zt+lcRd8R{*=$2Zx9NqVTSDeYIFh{90pw`FTPI+6vl@|`UR2Aa{lWZM*A!{%a6gM!H zQG#LMy*`2&yA5R0SLoNanm5dZ z$p5y+pa4s+dhgM-LUfED4oQWW5Ox3uHM3zwCB=so#V-9n*DfRU;1&tG8bVBMP>&tw zqeAE;B4)ij_HlN>F(3|MbV~aOYJvwG5}f!Tm&!tGF&wA*g^~x_(kwi>wvqZO5smKl zbCHOq)S5!gnAq$@=83hmY12UDGpkK=jwOo1ovor%cu3-fBgK|iRdFs=(_OU~V$oQ~ z=cUOqdCo)jOI?Qmu312g#Zj8{u^i0|B7NJ#oe~Wd78KH)xcl*B*JMF6CeQ2Yu|w&c zW=0O_hj!Bz4X#BNgCe~TBZmCZ_V-j*+ct@me6%l)m|$cE@AC~#W|eC8IIwn1JS z;lel6%PFW1Zl_ZxSIWULO>*$138o)9Tt`cFF>~_Gl;$j3hMi?JktHS-=~!7wOMAFU z4rX23K5H=Tn0Pa_JNC(0y$j?kv!xJI$TP`lw&_5+NE0zv7b`}wPCD48y;Hs-XvfSu zT0&gG(}6i*s=-k0=%vV(d99YbO3ciO>PB=+Fl@2rrd?|t*UWz~L$sDYswwR~@)2kwX!l7zW>U$GiX*r({tJgpQacCX9^#`3CbB6UP;RpFuNy_n++-+OGF zVM|?mCQgWLnV~4F;I3VHe=e>i3*iD?S}^OuM24KKyPn#emg_P6A-Tu~ETbWZCCi8h z+_z4#H0CIZ?(^)F%R0gxm<4e*&}M#`X%-Q!Wk=*a)>>NCC6_2G?^`U{P=s20x#~IMGXjNa7rrRQ$Ot+J__^K=y@-npB?30|BL{3dU_m<8dq7z;esP9Bz z^?Sr+CmbGCop4GWG$}THt~Ik`9CIidZ!0#Py&G%NU?!cXDs+lNO+7uBKo70QN};pa zL1svHIym`Ahjuiip3|oJhoskr>iNSp9=khiogmS|b$7g{S~#=rM1gFDb6MefHI!U-6b2kyLzJn*7hE&g|?P1 z>>H>_y@ZB>BJ%M5oDKH*! zgY@GZ)JoWNNXy>|x8KcZV;CBX#N%`rP+G_7(#IRNO;BPdZcNZ;M$!$~kYlX%Shk z%W3Xa-g8R@O}mO*&eBsOY2HpQw%YL(r730&#q^VyBw61bcAp?I3x;a=OKry^>1?D} zq;<>~*{0)gnm}AX)4}ND5|Fx zo}4fP)Dcm&w_1UuE3i01HEqb6xB#oOx4m86L|j9&_|0YB$*~Y<=@(ng z?4xbF_h#HSTmDGjI}n|H%y*)OlKWB2(5cfZg@t|ideHjKS7ISqo{wJAOZT@5pYM0` zB!Yzel4eVj&#Ntyr|yMWUH1KLDn$!SIlNtbA;PWEJcN7K?0a;y>aUYF2F_%Rn0(Yu zpAA`E7orx~IT;`);REI^O#149mX#BB=bQ5=W`C|8P&C$<0&IzH zHfv?M#BH~P%kV6B9IYVsx%Od)ELU{<9Ul4^NmDC!$b{D;9-=s1AT{l8=A;P-+ME{% z+WJ7wSti%!i~DRd$W!(t(0XukqyM4VUdiV)5;D^PPZ*b?6BvxiMKg3v51nFrrEBhj zRD(UIL*_;hWK#?n#Ui9Q9>U9$a%5_2H`Elps<}*+t~GqPEA2QYeN}H8$Jl1?6Z<&& z(!O*0w1m3fvf31#FpR}q@RIaR6Hr@~U# zQBtj3o5U%Oh;w-XyMCKpkHY9Pr3cziQmg)YzttJ`xD~3t7RIxf>VqjdeezE*A zUC&bSfg8EKMiwpoeAoU;6n*b9JF`d zXq($WAnR*pmM=>>n(&nvYt00MQOxhb+=5zKPQ{p~F6Bf_cTcK%$f`M92UPYPf4IBu zn4q$H>(~`5XPT1FS)rGncB+ap5K;>tQ{YXgGnvOUlbR}N+uVvT*(r>~w${1*Ab zDdtto+u&q5F6$16H#rE2^2qv(xoh;ab_Nyq_iXqa=9RG?QGk}8|PM4_zqcofry-4o8 z*v7*4qj5YiJGgLa4X|UXF`@h9Y;%fZ7}e{I&A}BtZ7%3Qj!?>+A$P`@m4@^YJ|7`I zy($;cY-168GL()%nx7~=6oY##!zQl|^m-$0y`WEFYcm+!8?yCb1K7dj4LLe}B6nzU z>Szv1c@7(OzbJX)D4b)ZRu)Oe$jyvfYy772kjYZq)6=8($PncxxC z0TgkZ%@adBxmyM$oVG@kB`@O1r+QO&IH(d87xLlQ9u0HN7%?M@;?zW4M-PtEEMn!a zweLN(@+ay*)n+9<){dSoek*J6gVxvzrf_ZIhT?rh;({zR9;xeRO{1Ilub zxm%G6`eXy5lJGPU%r7|e$^>py@&L-BZOeY3Bjucl$_|chi`rqEK9CrWTeUBB z7{&Tv@-*46UR%oVC#P98#pz+O;AHy_ZZXzi67GefS_9Q5 zY8)#G+rdRb;(Ry0o!x}5MB^X@AL>l7>O0^FwfvQISu^EEc=C<=M}pU2+Y*w${wmr8 zq^=WjcBqm4lC_AA5wOZO#Wnc4b3}ef<0{-!K(lOAmC7nA5Rgay#5Dy})2LZETkBX% zE2e=U&HR#0vAmGJe}-gtbYwB@u!K@Zebqc&sdW7~0u@bOk35j^g}7ob(i82X?Rt9j z%KnUVtsZ?h{v@mGYCVm*oC|K)E~78F9cU>)C4}i0c~wvHl&=Y1{7fN~B+xUwym%>xO z@~SARUy$w?1~gIqbQ3`{lBsP{l3D z!o1Z>t-y&1oOwbX<^9=?SpjY6mblo6ON-QZSFBSQn7}hnVPI@sgA*7yeqsN1p4GZi z_xVulEhi=V;dL~W)?7U2+cYi23~Fc8NYolQ)^g-Ro4ijzExsOP(`!5YnzSd30K4Ci zI-{{Q)_$xE&lf9ob-%a9)-&9Fj$DM|EN@%$-d&>n%{{;$tIC?;z>C`{8NzI3LqJAs!MarkLgMCWVbmFW?gK9kfMS#?_k5t z2;mJ~-MIH5)!lAo3G!6kI+hq*J62eQO+LS5wLa-DpQ7TX-7IE?)j3y*nrRI;1eT0_ zxk#HoIJApbaQgsvOkskSCMGcXXU40@?rK_jCQG5R4HOd?T5V*_X^t;V8VCUWTPg55{6qds_qSp=& znVxdZ7%H;L0-JEBWeZ)0M0d;Kj%|dnMBJq%u1-~aVL&^EDe{^XIBJ3HO2xo*$T@aP zSR#glhwkPuWa|{Eq;-fL>&XY4c(%iyK}3T6pr`AM6>TQq&V(6NX4J2)s_p8E;+Pz+ z2MyO?`CryYm>bn5OffZ&>iqyFkING8^QCSG`iA;>&z@xW`HJp}x-1P9qke@}irM%z zAza~KhyUUO++6pXQ@nLohUo7KoZyis*~|!W&7_EtLtT66Jy6$FvuABiFLUADSB_x; z?l-1O6KlikV_n#DPkqWza}U1bPDf2_C8N88r>@P;2{k}`3`R71hir1mrK4%{j8H!kMxgYp;abqJ>)d&dCDTdmtLE0s9aJu zvyRPstY4GtD+M%0P3Xs9<_3R3^kddy@jSF))20v_o}R8wEPCT|=02}usF)Bxf3;FX zvxNAnhA2gP$0ykt64Y4s>-7(GKe5PH+LbJ&j%y1zmzYqF6&C$CgGPogh*l z=dlj5q`v4yX?4cGc~gZ?_5_xTyCu|>gxGJOUp67zbXzlzwQ>93>A{mk{ek!Tdec6zrO!!<`Z?&d!fIRZy& zBFNNwbjgo+ATF?r(KQrWS6i;pshQ+q-N|nO?uSd+R5^x+p5q+GF_tqV;dfpL7rPyACZS9UK$L!ozcR4PPFA;M-X5t)Zt~1+MGaa2hB?OxLH2So6(m}2j zWmYyTzOk)o#$U(5<{+xf4&iM~)Sz0Pq1>sDq^UsRpkd0%AWrIJ*R-XyC-%UKlk;w0 zAi>Q6uD7*;lk}Fr15Rh>&4H!3IZ%Ee4>4rF+o-k!SJnbNfc=iPuU^SMxS6rkAqk$C zL_XuGd3y(zX0x0%5e*r|0MWSxixbDKbEk@rZPUffj)qXA*gpzsKf+Xx6$>k4IWm>4 zKSOPjIqpDdqEYb7Zz6X@pU+2Q67{h_>YwPP(((`{okANr@X_I6`aW28IQ+tlvpPf`vF9pEf;+Rc`hFRd`6 zd4ikT1*+%~%M7x=XBJDFqEWG{-hRE9wVNnyz*1HX$qr)B)dfiwV{HlI+A((=Hxa$G zaMyckkC~aP)XttVtY?VBdQ{*!s}(L?Ub=L7{WU>#qnfpMgxc#SzW>Z+$bd@1dHX)= zH3#2`)9^GMCEAG2re?Yuc0KNUJoriYy5&^ja2tLLj-op&hyCxYtNiFP6^sfr#MfZe zB!1G!Tt=aJCAqKi5PdsDv~CBq(`Wyq08JD=xuQPEo2Hio-9!?+KQz6wish_!@b2im2=g40XkE}VmQAMKd!;jUSWJ)%Yf6eW z=Meo`p1Pw(L1$MiT!0VS7N`%&F@$dgUmU}?DFv^ssi(~-Xx-ci zeUiqyB?rr#J+!zc#Mlr54>v+Jkp+H>w#N*7kUN6^^ch{FKwKbL(A_0JUl>|iyLk2T z5WZtwyJm4!XvvkBEDp%~AujHTM!HLjVQ&LI0}KCz+xYX@ZLM%enc#sITskR^D}@l$ z_ONtMeuP`Pr{2j;@*tcSfoZ}$@vz?oZ{c5o@T>4w0Tyo!`ocSXJq)7ZDDJ4}F%JGY z9V#;L%Vbpxvi#z0L6!va7*~X3_2(QIj>b>fFK7GZY~P~`<2}b=E`?dQzmDy%bFrW8 zuwMo9+wpjpa(@%s-^BLESbi2$r~9jcAA_H=U!Lt3lI6;w*}`ZX1wvt0_7_OlxC)e< zGVLGh7o75A1u<6UN~->o4*mHM3~|l>Th8zc_LeiG)VL&u^1pIN(T(80tJ$wU(=TjP zpD8U)Nh17D{#5>F*tiKV6jY@z|17^?<)0;pQO+J#?koE${97PK_LoR;qtW9RZ;c)a zv{B;XA^WG{=d^!6Fmi(8S3F)nQ%NX)>W@kmh24!8-M)wId%P^6JkCay9Ev{Tv|r*E zlAaQ2Vd^PK)qiDAnLmyf-F@R%e#!ckB%BST0so!;9|1=8Rs0)Mewgq~iT}nPM*(!Y zzXM{r{i%I^VR34ov>&}#QuW_ye>WJ?zDI}zFI>!&P{VM_JIz0ZjP8CT+i$#3+JBP@ zm-aZr|6A~M`|C;<3+Z*G(tgaRS;ni%KMH*VFS`BR8>Ic+8>Ic+j`VlB|1RtwhaXoL z#-4kn{XI8J`zoI+_mumJ&VktRn*C|EKh5@?@ulo3dNS;jOUiv?>tg9tKcR-PM-qwQ zzsG!&FXw>fI%ED<_7(Lx z>>ESUzA+%}51AQTs!;Y6z0_fU=pku;=yqve`BQm7*;8ge#0XRVA7}d`Y=4u(eZR8E zG{EkA9k{apumhLAl5s|?)c~?<<6TbsMIVup^U~NSDTfz@jcT^vcBxe00r?z$D*P&6 oQuCz3j#u*;{i<~TJI|Ytc#)`uoq*S5_HXQwzPj3B!C^H1KLOI$ssI20