【问题标题】:CUDA-like workflow for OpenCL用于 OpenCL 的类似 CUDA 的工作流程
【发布时间】:2016-03-16 00:38:28
【问题描述】:

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

在 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

【问题讨论】:

    标签: compilation workflow opencl static-linking


    【解决方案1】:

    查看SYCL,它提供单源C++ OpenCL。但是,尚未在每个平台上都可用。

    https://www.khronos.org/sycl

    【讨论】:

    • 这不是轻描淡写吗?它似乎需要尚未标准的 C++ 功能(C++17 材料?)另外,这是一个规范/标准;是否有任何符合标准的 SYCL 实现?
    • 是的,也许是轻描淡写;我不使用 SYCL,所以我不确定它的可用性。
    • 那么也许在 3 年左右我可以接受这个答案 :-) 不过你得到了我的 +1。
    【解决方案2】:

    在 TensorFlow 中启用类似 CUDA 的工作流已经在进行中,它使用 SYCL 1.2 - 它是积极向上的。

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

    工作流程有点不同,因为您不必像 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 需要经过 Buffers 和 Accessors。

    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(分支 dev/eigen_mehdi)

    使用的特征是:https://bitbucket.org/mehdi_goli/opencl(分支默认)

    我们快到了!欢迎投稿! :)

    【讨论】:

      猜你喜欢
      • 2012-03-06
      • 2011-04-17
      • 2017-01-04
      • 1970-01-01
      • 2012-05-07
      • 2011-07-15
      • 1970-01-01
      • 2015-12-14
      • 1970-01-01
      相关资源
      最近更新 更多