From 48ffa5cfe47de5eb596bb279d8249fae829d88f4 Mon Sep 17 00:00:00 2001 From: "Jiang, Zhiwei" Date: Wed, 16 Oct 2024 15:54:06 +0800 Subject: [PATCH 1/3] [SYCL][COMPAT] Add a free function version of has_capability_or_fail Signed-off-by: Jiang, Zhiwei --- sycl/doc/syclcompat/README.md | 4 ++++ sycl/include/syclcompat/device.hpp | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/sycl/doc/syclcompat/README.md b/sycl/doc/syclcompat/README.md index df8d453a41d57..edaf3e48710b8 100644 --- a/sycl/doc/syclcompat/README.md +++ b/sycl/doc/syclcompat/README.md @@ -1048,6 +1048,10 @@ static inline unsigned int get_device_id(const sycl::device &dev); // Util function to get the number of available devices static inline unsigned int device_count(); +// Util function to check whether a device supports some kinds of sycl::aspect. +static inline void +has_capability_or_fail(const sycl::device &dev, + const std::initializer_list &props); } // syclcompat ``` diff --git a/sycl/include/syclcompat/device.hpp b/sycl/include/syclcompat/device.hpp index 4e227a635c44e..af8f00d05e946 100644 --- a/sycl/include/syclcompat/device.hpp +++ b/sycl/include/syclcompat/device.hpp @@ -959,4 +959,10 @@ static inline unsigned int get_device_id(const sycl::device &dev) { static inline unsigned int device_count() { return detail::dev_mgr::instance().device_count(); } + +static inline void +has_capability_or_fail(const sycl::device &dev, + const std::initializer_list &props) { + get_device(get_device_id(dev)).has_capability_or_fail(props); +} } // namespace syclcompat From 2e24de8067d55c80380d0443ef080c7e9dcc64b8 Mon Sep 17 00:00:00 2001 From: "Jiang, Zhiwei" Date: Wed, 16 Oct 2024 16:01:09 +0800 Subject: [PATCH 2/3] Update Signed-off-by: Jiang, Zhiwei --- sycl/include/syclcompat/device.hpp | 83 +++++++++++++++--------------- 1 file changed, 41 insertions(+), 42 deletions(-) diff --git a/sycl/include/syclcompat/device.hpp b/sycl/include/syclcompat/device.hpp index af8f00d05e946..498d5472391b1 100644 --- a/sycl/include/syclcompat/device.hpp +++ b/sycl/include/syclcompat/device.hpp @@ -613,47 +613,7 @@ Use 64 bits as memory_bus_width default value." /// sycl::aspect. void has_capability_or_fail( const std::initializer_list &props) const { - for (const auto &it : props) { - if (has(it)) - continue; - switch (it) { - case sycl::aspect::fp64: - throw sycl::exception(sycl::make_error_code(sycl::errc::runtime), - "[SYCLcompat] 'double' is not supported in '" + - get_info() + - "' device"); - break; - case sycl::aspect::fp16: - throw sycl::exception(sycl::make_error_code(sycl::errc::runtime), - "[SYCLcompat] 'half' is not supported in '" + - get_info() + - "' device"); - break; - default: -#define __SYCL_ASPECT(ASPECT, ID) \ - case sycl::aspect::ASPECT: \ - return #ASPECT; -#define __SYCL_ASPECT_DEPRECATED(ASPECT, ID, MESSAGE) __SYCL_ASPECT(ASPECT, ID) -#define __SYCL_ASPECT_DEPRECATED_ALIAS(ASPECT, ID, MESSAGE) - auto getAspectNameStr = [](sycl::aspect AspectNum) -> std::string { - switch (AspectNum) { -#include -#include - default: - return "unknown aspect"; - } - }; -#undef __SYCL_ASPECT_DEPRECATED_ALIAS -#undef __SYCL_ASPECT_DEPRECATED -#undef __SYCL_ASPECT - throw sycl::exception(sycl::make_error_code(sycl::errc::runtime), - "[SYCLcompat] '" + getAspectNameStr(it) + - "' is not supported in '" + - get_info() + - "' device"); - } - break; - } + ::syclcompat::has_capability_or_fail(*this, props); } private: @@ -963,6 +923,45 @@ static inline unsigned int device_count() { static inline void has_capability_or_fail(const sycl::device &dev, const std::initializer_list &props) { - get_device(get_device_id(dev)).has_capability_or_fail(props); + for (const auto &it : props) { + if (dev.has(it)) + continue; + switch (it) { + case sycl::aspect::fp64: + throw sycl::exception(sycl::make_error_code(sycl::errc::runtime), + "[SYCLcompat] 'double' is not supported in '" + + dev.get_info() + + "' device"); + break; + case sycl::aspect::fp16: + throw sycl::exception(sycl::make_error_code(sycl::errc::runtime), + "[SYCLcompat] 'half' is not supported in '" + + dev.get_info() + + "' device"); + break; + default: +#define __SYCL_ASPECT(ASPECT, ID) \ + case sycl::aspect::ASPECT: \ + return #ASPECT; +#define __SYCL_ASPECT_DEPRECATED(ASPECT, ID, MESSAGE) __SYCL_ASPECT(ASPECT, ID) +#define __SYCL_ASPECT_DEPRECATED_ALIAS(ASPECT, ID, MESSAGE) + auto getAspectNameStr = [](sycl::aspect AspectNum) -> std::string { + switch (AspectNum) { +#include +#include + default: + return "unknown aspect"; + } + }; +#undef __SYCL_ASPECT_DEPRECATED_ALIAS +#undef __SYCL_ASPECT_DEPRECATED +#undef __SYCL_ASPECT + throw sycl::exception( + sycl::make_error_code(sycl::errc::runtime), + "[SYCLcompat] '" + getAspectNameStr(it) + "' is not supported in '" + + dev.get_info() + "' device"); + } + break; + } } } // namespace syclcompat From b5a25935b60e4cd94e3a6855358c5198608b99ab Mon Sep 17 00:00:00 2001 From: "Jiang, Zhiwei" Date: Thu, 17 Oct 2024 07:17:47 +0800 Subject: [PATCH 3/3] Move the free function before member function Signed-off-by: Jiang, Zhiwei --- sycl/include/syclcompat/device.hpp | 90 +++++++++++++++--------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/sycl/include/syclcompat/device.hpp b/sycl/include/syclcompat/device.hpp index 498d5472391b1..77d67c4097245 100644 --- a/sycl/include/syclcompat/device.hpp +++ b/sycl/include/syclcompat/device.hpp @@ -334,6 +334,51 @@ static int get_minor_version(const sycl::device &dev) { return minor; } +static inline void +has_capability_or_fail(const sycl::device &dev, + const std::initializer_list &props) { + for (const auto &it : props) { + if (dev.has(it)) + continue; + switch (it) { + case sycl::aspect::fp64: + throw sycl::exception(sycl::make_error_code(sycl::errc::runtime), + "[SYCLcompat] 'double' is not supported in '" + + dev.get_info() + + "' device"); + break; + case sycl::aspect::fp16: + throw sycl::exception(sycl::make_error_code(sycl::errc::runtime), + "[SYCLcompat] 'half' is not supported in '" + + dev.get_info() + + "' device"); + break; + default: +#define __SYCL_ASPECT(ASPECT, ID) \ + case sycl::aspect::ASPECT: \ + return #ASPECT; +#define __SYCL_ASPECT_DEPRECATED(ASPECT, ID, MESSAGE) __SYCL_ASPECT(ASPECT, ID) +#define __SYCL_ASPECT_DEPRECATED_ALIAS(ASPECT, ID, MESSAGE) + auto getAspectNameStr = [](sycl::aspect AspectNum) -> std::string { + switch (AspectNum) { +#include +#include + default: + return "unknown aspect"; + } + }; +#undef __SYCL_ASPECT_DEPRECATED_ALIAS +#undef __SYCL_ASPECT_DEPRECATED +#undef __SYCL_ASPECT + throw sycl::exception( + sycl::make_error_code(sycl::errc::runtime), + "[SYCLcompat] '" + getAspectNameStr(it) + "' is not supported in '" + + dev.get_info() + "' device"); + } + break; + } +} + /// device extension class device_ext : public sycl::device { public: @@ -919,49 +964,4 @@ static inline unsigned int get_device_id(const sycl::device &dev) { static inline unsigned int device_count() { return detail::dev_mgr::instance().device_count(); } - -static inline void -has_capability_or_fail(const sycl::device &dev, - const std::initializer_list &props) { - for (const auto &it : props) { - if (dev.has(it)) - continue; - switch (it) { - case sycl::aspect::fp64: - throw sycl::exception(sycl::make_error_code(sycl::errc::runtime), - "[SYCLcompat] 'double' is not supported in '" + - dev.get_info() + - "' device"); - break; - case sycl::aspect::fp16: - throw sycl::exception(sycl::make_error_code(sycl::errc::runtime), - "[SYCLcompat] 'half' is not supported in '" + - dev.get_info() + - "' device"); - break; - default: -#define __SYCL_ASPECT(ASPECT, ID) \ - case sycl::aspect::ASPECT: \ - return #ASPECT; -#define __SYCL_ASPECT_DEPRECATED(ASPECT, ID, MESSAGE) __SYCL_ASPECT(ASPECT, ID) -#define __SYCL_ASPECT_DEPRECATED_ALIAS(ASPECT, ID, MESSAGE) - auto getAspectNameStr = [](sycl::aspect AspectNum) -> std::string { - switch (AspectNum) { -#include -#include - default: - return "unknown aspect"; - } - }; -#undef __SYCL_ASPECT_DEPRECATED_ALIAS -#undef __SYCL_ASPECT_DEPRECATED -#undef __SYCL_ASPECT - throw sycl::exception( - sycl::make_error_code(sycl::errc::runtime), - "[SYCLcompat] '" + getAspectNameStr(it) + "' is not supported in '" + - dev.get_info() + "' device"); - } - break; - } -} } // namespace syclcompat