#ifndef GUARD_HOST_TEST_RTC_INCLUDE_RTC_KERNEL #define GUARD_HOST_TEST_RTC_INCLUDE_RTC_KERNEL #include #include #include #include namespace rtc { struct kernel_argument { template , class = std::enable_if_t{}>> kernel_argument(T&& x) : size(sizeof(U)), align(alignof(U)), data(&x) // NOLINT { } std::size_t size; std::size_t align; void* data; }; std::vector pack_args(const std::vector& args); struct kernel_impl; struct kernel { kernel() = default; kernel(const char* image, const std::string& name); template kernel(const std::vector& image, const std::string& name) : kernel(reinterpret_cast(image.data()), name) { static_assert(sizeof(T) == 1, "Only byte types"); } void launch(hipStream_t stream, std::size_t global, std::size_t local, const std::vector& args) const; void launch(hipStream_t stream, std::size_t global, std::size_t local, std::vector args) const; template auto launch(hipStream_t stream, std::size_t global, std::size_t local, Ts... zs) const { return [=](auto&&... xs) { launch(stream, global, local, std::vector{xs...}, zs...); }; } private: std::shared_ptr impl; }; } // namespace rtc #endif