如何从 SYCL 内核中提取控制流?
Posted
技术标签:
【中文标题】如何从 SYCL 内核中提取控制流?【英文标题】:How is control flow extracted from a SYCL kernel? 【发布时间】:2018-01-23 10:41:02 【问题描述】:使用 SYCL 在任何 OpenCL 设备上运行代码不需要自定义编译器,因为一切都在库中完成(充满了模板魔法),标准的 GCC/Clang 就可以了。它是否正确? (特别是在我正在使用的 triSYCL 的情况下......)
如果是这样...我知道可以通过在自定义“句柄”或“包装器”类上重载一组运算符来提取简单的表达式树,但控制流并非如此。我错了吗?
this paper 的第 3.1 节讨论了向 C++ 添加 EDSL 的几种不同方法的优缺点,但我对 SYCL 使用的方法的实际技术实现更感兴趣。
我尝试在一些与 SYCL 相关的项目(Eigen、TensorFlow、triSYCL、ComputeCpp 等)中查看源代码,但到目前为止我无法在其中找到答案。
那么:SYCL 库(?)如何在不需要自定义/扩展编译器的情况下发现内核的完整控制流图(以普通 C++ lambda 形式给出)?
【问题讨论】:
【参考方案1】:我认为你是对的。
如果你为 CPU 编译 SYCL,因为 SYCL 是一个纯 C++ 可执行 DSEL,你可以有一个只使用普通 C++ 编译器的实现。 例如,这就是 triSYCL 的工作方式。 https://github.com/triSYCL/triSYCL
我不知道 ComputeCpp 的详细信息。在https://github.com/triSYCL/triSYCL/blob/master/doc/about-sycl.rst 上有一个关于一个非常有趣但很老的演示文稿的链接:
使用实现 OpenCL SYCL 共享源 C++ 编程模型 Clang/LLVM,戈登布朗。 2014 年 11 月 17 日,LLVM 研讨会 HPC 中的编译器基础架构,SuperComputing 2014 http://www.codeplay.com/public/uploaded/publications/SC2014_LLVM_HPC.pdf
在 triSYCL 以设备为目标的情况下,还有一个设备编译器。我要推一个带有设计文档的新版本……同时你可以看看https://github.com/triSYCL/triSYCL/tree/devicehttps://github.com/triSYCL/llvmhttps://github.com/triSYCL/clang
sycl-gtx 正在使用一些基于宏的 SYCL 语法扩展来在内核中拥有控制流的元表示,如本示例所示:https://github.com/ProGTX/sycl-gtx/blob/master/tests/regression/work_efficient_prefix_sum.cpp
【讨论】:
【参考方案2】:答案是:这不是它的做法,我仍然认为不可能。
即使我的第一个假设也是错误的。 如果你只有一个普通的 C++ 编译器,那么任何 SYCL 内核都只能由运行“控制器”代码的主机设备(CPU)“在软件中”执行。
要将内核转换为 OpenCL(或 SPIR-V)以在任何其他设备上执行,需要“增强”编译器;或两个编译器,一个用于主机,一个用于计算设备。
可以在这里找到一个很好的解释:https://www.codeplay.com/portal/introduction-to-sycl
最相关的部分是“SYCL 工作流程是什么样的?”
【讨论】:
以上是关于如何从 SYCL 内核中提取控制流?的主要内容,如果未能解决你的问题,请参考以下文章