Compilation 类似CUDA的OpenCL工作流

Compilation 类似CUDA的OpenCL工作流,compilation,workflow,opencl,static-linking,Compilation,Workflow,Opencl,Static Linking,OpenCL编程的典型示例工作流似乎专注于字符串中的源代码,传递给JIT编译器,然后最终排队(使用特定的内核名称);编译结果可以缓存,但这要留给程序员来处理 在CUDA中,代码以非JIT方式编译为对象文件(与主机端代码一起编译,但暂时忘记这一点),然后在排队或参数等上下文中引用设备端函数 现在,我想使用第二种工作流,但是使用OpenCL源代码。也就是说,假设我有一些C主机端代码my_app.C,还有一些OpenCL内核代码在一个单独的文件my_kernel.cl(为了讨论的目的,它是自包含的)。

OpenCL编程的典型示例工作流似乎专注于字符串中的源代码,传递给JIT编译器,然后最终排队(使用特定的内核名称);编译结果可以缓存,但这要留给程序员来处理

在CUDA中,代码以非JIT方式编译为对象文件(与主机端代码一起编译,但暂时忘记这一点),然后在排队或参数等上下文中引用设备端函数

现在,我想使用第二种工作流,但是使用OpenCL源代码。也就是说,假设我有一些C主机端代码
my_app.C
,还有一些OpenCL内核代码在一个单独的文件
my_kernel.cl
(为了讨论的目的,它是自包含的)。我希望能够在
my_kernel.cl
上运行一个神奇的命令,获得一个
my_kernel。无论什么
,链接或伪链接与
my_app.o
,并获得一个二进制文件。现在,在
my_app.c
中,我希望能够以某种方式引用内核,即使它不是一个外部符号,作为已编译的OpenCL程序(或程序+内核名称)-并且不会得到编译错误


这是否得到了某种支持?使用nVIDIA的ICD或其他ICD之一?如果不是,至少有一些支持,例如,神奇的内核编译器+生成额外的头或源存根,用于编译<代码> MyOAPApp.c>代码>

< p>查看Cyc>/Stult>,它提供了单源C++ OpenCL。但是,还没有在每个平台上都提供


TensorFlow中已经有了类似CUDA的工作流,并且它使用了SYCL 1.2——它正在积极地向上流动

与CUDA类似,SYCL的方法需要以下步骤:

  • 通过设备工厂进行设备注册(设备称为SYCL)-在此处完成:
  • 上述设备的操作登记。为了创建/端口操作,您可以:
    • 重新使用Eigen的代码,因为张量模块有SYCL后端(看这里:-我们只是部分专门化了SYCL设备的操作,并调用已经实现的函子
    • 编写SYCL代码-它已经为FillPhiloxRandom完成-请参阅
      • SYCL内核使用现代C语言++
      • 您可以使用OpenCL互操作性-由于它,您可以编写纯OpenCL C内核代码!-我认为这一点与您最相关
工作流有点不同,因为您不必像CUDA或任何
.cu.cc
文件那样对函子模板进行显式实例化(事实上,您不必添加任何新文件-避免混乱构建系统)

还有这个东西:

DR-CUDA可以创建“持久”指针,OpenCL需要遍历缓冲区和访问器

Codeplay的SYCL编译器(ComputeCpp)目前需要具有SPIR扩展的OpenCL 1.2-这些是Intel CPU、Intel GPU(Beignet正在开发中)、AMD GPU(尽管较旧的驱动程序)-更多的平台即将到来

安装说明可在此处找到:

我们的努力可以在我的TensorFlow分支中进行跟踪:(分支开发/eigen_mehdi)

使用的特征值为:(分支默认值)


我们快到了!欢迎捐款!:)

这不是轻描淡写吗?它似乎需要标准的C++功能(C++ 17材质)?是否有符合标准的SYCL实现?是的,可能是轻描淡写;我不使用SYCL,所以我不确定它的可用性。也许在3年左右的时间里,我可以接受这个答案:-)你得到了我的+1。