@@ -334,6 +334,51 @@ static int get_minor_version(const sycl::device &dev) {
334
334
return minor;
335
335
}
336
336
337
+ static inline void
338
+ has_capability_or_fail (const sycl::device &dev,
339
+ const std::initializer_list<sycl::aspect> &props) {
340
+ for (const auto &it : props) {
341
+ if (dev.has (it))
342
+ continue ;
343
+ switch (it) {
344
+ case sycl::aspect::fp64:
345
+ throw sycl::exception (sycl::make_error_code (sycl::errc::runtime),
346
+ " [SYCLcompat] 'double' is not supported in '" +
347
+ dev.get_info <sycl::info::device::name>() +
348
+ " ' device" );
349
+ break ;
350
+ case sycl::aspect::fp16:
351
+ throw sycl::exception (sycl::make_error_code (sycl::errc::runtime),
352
+ " [SYCLcompat] 'half' is not supported in '" +
353
+ dev.get_info <sycl::info::device::name>() +
354
+ " ' device" );
355
+ break ;
356
+ default :
357
+ #define __SYCL_ASPECT (ASPECT, ID ) \
358
+ case sycl::aspect::ASPECT: \
359
+ return #ASPECT;
360
+ #define __SYCL_ASPECT_DEPRECATED (ASPECT, ID, MESSAGE ) __SYCL_ASPECT(ASPECT, ID)
361
+ #define __SYCL_ASPECT_DEPRECATED_ALIAS (ASPECT, ID, MESSAGE )
362
+ auto getAspectNameStr = [](sycl::aspect AspectNum) -> std::string {
363
+ switch (AspectNum) {
364
+ #include < sycl/info/aspects.def>
365
+ #include < sycl/info/aspects_deprecated.def>
366
+ default :
367
+ return " unknown aspect" ;
368
+ }
369
+ };
370
+ #undef __SYCL_ASPECT_DEPRECATED_ALIAS
371
+ #undef __SYCL_ASPECT_DEPRECATED
372
+ #undef __SYCL_ASPECT
373
+ throw sycl::exception (
374
+ sycl::make_error_code (sycl::errc::runtime),
375
+ " [SYCLcompat] '" + getAspectNameStr (it) + " ' is not supported in '" +
376
+ dev.get_info <sycl::info::device::name>() + " ' device" );
377
+ }
378
+ break ;
379
+ }
380
+ }
381
+
337
382
// / device extension
338
383
class device_ext : public sycl ::device {
339
384
public:
@@ -613,47 +658,7 @@ Use 64 bits as memory_bus_width default value."
613
658
/// sycl::aspect.
614
659
void has_capability_or_fail(
615
660
const std::initializer_list<sycl::aspect> &props) const {
616
- for (const auto &it : props) {
617
- if (has(it))
618
- continue;
619
- switch (it) {
620
- case sycl::aspect::fp64:
621
- throw sycl::exception(sycl::make_error_code(sycl::errc::runtime),
622
- " [SYCLcompat] ' double' is not supported in ' " +
623
- get_info<sycl::info::device::name>() +
624
- "' device" );
625
- break;
626
- case sycl::aspect::fp16:
627
- throw sycl::exception(sycl::make_error_code(sycl::errc::runtime),
628
- " [SYCLcompat] ' half' is not supported in ' " +
629
- get_info<sycl::info::device::name>() +
630
- "' device" );
631
- break;
632
- default:
633
- #define __SYCL_ASPECT(ASPECT, ID) \
634
- case sycl::aspect::ASPECT: \
635
- return #ASPECT;
636
- #define __SYCL_ASPECT_DEPRECATED(ASPECT, ID, MESSAGE) __SYCL_ASPECT(ASPECT, ID)
637
- #define __SYCL_ASPECT_DEPRECATED_ALIAS(ASPECT, ID, MESSAGE)
638
- auto getAspectNameStr = [](sycl::aspect AspectNum) -> std::string {
639
- switch (AspectNum) {
640
- #include <sycl/info/aspects.def>
641
- #include <sycl/info/aspects_deprecated.def>
642
- default:
643
- return " unknown aspect" ;
644
- }
645
- };
646
- #undef __SYCL_ASPECT_DEPRECATED_ALIAS
647
- #undef __SYCL_ASPECT_DEPRECATED
648
- #undef __SYCL_ASPECT
649
- throw sycl::exception(sycl::make_error_code(sycl::errc::runtime),
650
- " [SYCLcompat] ' " + getAspectNameStr(it) +
651
- "' is not supported in ' " +
652
- get_info<sycl::info::device::name>() +
653
- "' device" );
654
- }
655
- break;
656
- }
661
+ ::syclcompat::has_capability_or_fail(*this, props);
657
662
}
658
663
659
664
private:
0 commit comments