用于OpenCL的CUDA式工作流程
OpenCL编程的典型示例工作流程似乎集中于字符串中的源代码,传递给JIT编译器,然后最终入队(使用特定的内核名称);并且编译结果可以被缓存 - 但是这对程序员来说是需要照顾的。用于OpenCL的CUDA式工作流程
在CUDA中,代码以非JIT方式编译为目标文件(与主机端代码一起,但暂时忘记了这一点),然后在上下文中引用设备端函数入队或参数等。
现在,我想要第二种工作流程,但使用OpenCL源代码。也就是说,假设我有一些C主机端代码my_app.c
和一些OpenCL内核代码在单独的文件my_kernel.cl
(为了讨论的目的是独立的)。我希望能够在my_kernel.cl
上运行魔术命令,获得my_kernel.whatever
,链接或虚假链接以及my_app.o
,并获得二进制文件。现在,在my_app.c
中,我希望能够以某种方式将内核称为编译OpenCL程序(或程序+内核名称),即使它不是外部符号,也不会出现编译错误。
这是支持吗?使用nVIDIA的ICD还是与其他ICD一起使用?如果没有,至少是这个支持的一些,比如说魔法内核编译器+生成一个额外的头文件或源代码片段,用于编译my_app.c
?
已经有持续的努力,使CUDA样的工作流程在TensorFlow,它使用SYCL 1.2 - 这是积极向上流。经由设备工厂
- 设备注册(设备称为SYCL) - 在这里完成:
类似于CUDA,SYCL的方法需要下列步骤https://github.com/lukeiwanski/tensorflow/tree/master/tensorflow/core/common_runtime/sycl
- 操作登记为上述设备。为了创建/端口的操作,您可以:
- 再利用,因为张量模块征的代码有SYCL后端(看这里:https://github.com/lukeiwanski/tensorflow/blob/opencl/adjustcontrastv2/tensorflow/core/kernels/adjust_contrast_op.cc#L416 - 我们只是部分专门用于SYCL设备的操作和调用已经实现了仿https://github.com/lukeiwanski/tensorflow/blob/opencl/adjustcontrastv2/tensorflow/core/kernels/adjust_contrast_op.h#L91 ;
- 写SYCL代码 - 它已经做了FillPhiloxRandom - 见https://github.com/lukeiwanski/tensorflow/blob/master/tensorflow/core/kernels/random_op.cc#L685
- SYCL内核采用现代C++
- 可以使用OpenCL的互操作性 - 多亏你可以写纯的OpenCL C内核代码! - 我觉得这一点是最贴近您
的工作流程是有点不同,因为你没有做的仿函数模板的显式实例为CUDA做https://github.com/lukeiwanski/tensorflow/blob/master/tensorflow/core/kernels/adjust_contrast_op_gpu.cu.cc或任何.cu.cc
文件(事实上,你不必添加任何新文件 - 避免与构建系统混乱)
以及这件事:https://github.com/lukeiwanski/tensorflow/issues/89;
TL; DR-CUDA可以创建“持久”指针,OpenCL需要通过缓冲区和访问器。
Codeplay的SYCL编译器(ComputeCpp)目前需要SPIR扩展的OpenCL 1.2--这些是Intel CPU,Intel GPU(Beignet工作正在进行中),AMD GPU(尽管较旧的驱动程序) - 其他平台即将推出!
安装说明可以在这里找到:https://www.codeplay.com/portal/03-30-17-setting-up-tensorflow-with-opencl-using-sycl
我们的努力可以在我的TensorFlow的叉跟踪:https://github.com/lukeiwanski/tensorflow(分公司开发/ eigen_mehdi)
征使用的是:https://bitbucket.org/mehdi_goli/opencl(分支默认)
我们到达那里!欢迎贡献! :)
是不是那种轻描淡写?它似乎需要尚未标准的C++功能(C++ 17材料?)另外,这是一个规范/标准;有没有符合SYCL的实现? – einpoklum
是的,也许是轻描淡写;我不使用SYCL,所以我不确定它的可用性。 – Dithermaster
然后,也许在3年左右,我可以接受这个答案:-)你虽然有我的+1。 – einpoklum