使用SYCL在任何OpenCL设备上运行代码并不需要自定义编译器,因为所有内容都在库中完成(充满模板魔法),标准GCC / Clang也可以。它是否正确? (特别是在triSYCL的情况下,我正在使用......)
如果是这样的话......我知道可以通过在自定义" handle"上重载一堆运算符来提取简单的表达式树。或"包装"类,但控制流不是这种情况。我错了吗?
this paper的3.1节讨论了将EDSL添加到C ++的几种不同方法的优缺点,但我对SYCL使用的方法的实际技术实现更感兴趣。
我试着查看一些与SYCL相关的项目(Eigen,TensorFlow,triSYCL,ComputeCpp等)的来源,但到目前为止我找不到答案。
那么:SYCL库(?)如何发现内核的完整控制流图,以普通的C ++ lambda形式提供,而不需要自定义/扩展编译器?
答案 0 :(得分:2)
我认为你是对的。
如果为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,Gordon Brown。 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/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
答案 1 :(得分:1)
答案是:这不是它的完成方式,我仍然认为不可能。
即便是我的第一个假设也是错的。 如果你只拥有一个普通的C ++编译器,那么任何SYCL内核只能由“软件”执行,由运行“控制器”代码的主机设备(CPU)执行。
要将内核转换为OpenCL(或SPIR-V)以便在任何其他设备上执行,需要“增强”编译器;或两个编译器,一个用于主机,一个用于计算设备。
可在此处找到一个很好的解释:https://www.codeplay.com/portal/introduction-to-sycl
最相关的部分是“SYCL工作流程看起来像什么?”