如何从 SYCL 内核中提取控制流?

How is control flow extracted from a SYCL kernel?

在任何 OpenCL 设备上将 SYCL 用于 运行 代码不需要自定义编译器,因为一切都在库中完成(充满模板魔法),标准 GCC/Clang 就可以了正好。这个对吗? (特别是在我使用的 triSYCL 的情况下...)

如果是这样...我知道可以通过在自定义 "handle" 或 "wrapper" 类 上重载一堆运算符来提取简单的表达式树,但事实并非如此与控制流。我错了吗?

this paper 的第 3.1 节讨论了将 EDSL 添加到 C++ 的几种不同方法的优缺点,但我更感兴趣的是 SYCL 使用的方法的实际技术实现。

我试图查看一些与 SYCL 相关的项目(Eigen、TensorFlow、triSYCL、ComputeCpp 等)的源代码,但到目前为止我无法在其中找到答案。

那么:SYCL 库(?)如何在不需要 custom/extended 编译器的情况下发现作为普通 C++ lambda 给出的内核的完整控制流图?

答案是:这不是它的做法,我仍然认为这不可能。

甚至我的第一个假设也是错误的。 如果你只有一个普通的 C++ 编译器,那么任何 SYCL 内核只能由主机设备执行 "in software" (CPU) 运行 "controller" 代码。

要将内核转换为 OpenCL(或 SPIR-V)以在任何其他设备上执行,需要 "augmented" 编译器;或两个编译器,一个用于主机,一个用于计算设备。

可以在这里找到很好的解释:https://www.codeplay.com/portal/introduction-to-sycl

最相关的部分是"What Would A SYCL Work Flow Look Like?"

我认为你是对的。

如果您为 CPU 编译 SYCL,因为 SYCL 是纯 C++ 可执行 DSEL,您可以拥有仅使用普通 C++ 编译器的实现。 例如,这就是 triSYCL 的工作方式。 https://github.com/triSYCL/triSYCL

我不知道ComputeCpp的细节。在 https://github.com/triSYCL/triSYCL/blob/master/doc/about-sycl.rst 上有一个 link 关于一个非常有趣但很旧的演示文稿:

Implementing the OpenCL SYCL Shared Source C++ Programming Model using Clang/LLVM, Gordon Brown. November 17, 2014, Workshop on the LLVM Compiler Infrastructure in HPC, SuperComputing 2014 http://www.codeplay.com/public/uploaded/publications/SC2014_LLVM_HPC.pdf

在 triSYCL 以设备为目标的情况下,还有一个设备编译器。我要推一个新版本,有设计文档。。。同时,你可以看看https://github.com/triSYCL/triSYCL/tree/device https://github.com/triSYCL/llvm https://github.com/triSYCL/clang

sycl-gtx 使用一些基于宏的 SYCL 语法扩展来在内核中具有控制流的元表示,如本例所示:https://github.com/ProGTX/sycl-gtx/blob/master/tests/regression/work_efficient_prefix_sum.cpp