【问题标题】:Is it possible to write OpenCL kernels in C++ rather than C?是否可以用 C++ 而不是 C 编写 OpenCL 内核?
【发布时间】:2016-11-10 03:26:34
【问题描述】:

我知道有一个 openCL C++ API,但是我在编译我的内核时遇到了问题……内核必须用 C 语言编写吗?然后它只是允许用 C++ 编写的主机代码?或者有什么方法可以用我找不到的 C++ 编写内核?具体来说,我正在尝试使用 pyopencl 编译我的内核,但它似乎失败了,因为它将它们编译为 C 代码。

【问题讨论】:

  • OpenCL C 是 C99 的子集。还有 OpenCL C++,它是 C++14 的子集,但尚未由任何供应商实现。宿主代码可以用C、C++、python等编写,你的代码在哪里?
  • 我会接受这个答案。所以让我检查一下我的理解:OpenCL C++ 已经指定,但还没有在任何平台上实现?所以我必须用 OpenCL C 编写我的内核?

标签: c++ opencl gpgpu pyopencl


【解决方案1】:

OpenCL CC99 的子集。

还有 OpenCL C++(OpenCL 2.1 和 OpenCL 2.2 规范),它是 C++14 的子集,但尚未由任何供应商实现(OpenCL 2.1 部分由英特尔实现,但未由 C++ 内核实现)。

主机代码可以用C、C++、python等编写。

简而言之,您可以在wikipedia 上阅读有关 OpenCL 的信息。每个 OpenCL 版本都有一个描述。在pyopencl 中,您可以使用 OpenCL1.2(据我所知,尚不支持 OpenCL2.0)。 有关 OpenCL 的更多详细信息,请访问 Khronos 网站。

【讨论】:

  • 自 2012 年以来,AMD 的实现以 extension 的形式支持(有限)数量的 C++ 功能。
  • @doqtor,你能根据当前的情况更新你的答案吗?
【解决方案2】:

我会在 Codeplay 的 ComputeCpp 上添加 SYCL。他们在 IWOCL.org 上非常积极地推广使用单一源 C++ 主机和内核代码。 SYCL 具有“幕后”的 OpenCL 执行模型。 https://en.wikipedia.org/wiki/SYCL。尽管 Wikipedia 有关于 SYCL 的声明:“开放标准 SYCL 和 OpenCL 类似于来自 Nvidia 的供应商特定 CUDA。”这与 SYCL 和 OpenCL 的可移植代码(不是性能可移植)的意图相去甚远。

您可以在sycl.tech 网站上找到有关 SYCL 的信息、新闻、博客、视频和资源。

【讨论】:

  • 刚刚得知 RedHat 开发人员开始研究供应商中立的计算堆栈。 SYCL 是前端:phoronix.com/…
  • 我今天早上在 LinkedIn 上发现的另一个消息是英特尔正在寻求添加 SYCL,包括 FPGA:phoronix.com/…
【解决方案3】:

作为参考,还有Boost.Compute。它对 pyopencl 没有帮助,但它解决了 pyopencl 所做的许多问题,并且具有一些元编程魔法,有助于在 C++ 中编写 OpenCL 内核。

This SO question(在 Boost.Compute FAQ 中引用)还包含对 OpenCL 对开发人员提出的一些相关设计约束的很好讨论。

【讨论】:

    【解决方案4】:

    这是一个老问题,“解决”它的工作已经进行了一段时间......

    有一个社区驱动的 C++ 用于 OpenCL 内核语言,由 clang Clang C++ for OpenCL 实现,还有一个 Khronos 扩展 cl_ext_cxx_for_opencl 也将这种语言的在线编译添加到 OpenCL 驱动程序中。 Arm 刚刚宣布支持此extension。尽管也可以使用上游工具将这种语言的内核离线编译成机器二进制文件、SPIR-V 或任何其他 IR,然后将预编译的代码加载到 OpenCL 驱动程序中而无需任何扩展。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 2019-10-23
      • 2022-01-05
      • 2015-05-09
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      相关资源
      最近更新 更多