我知道有一个openCL C ++ API,但我在编译内核时遇到问题......内核是否必须用C语言编写?然后它只是允许用C ++编写的主机代码?或者有没有办法在C ++中编写我没有找到的内核?具体来说,我正在尝试使用pyopencl编译我的内核,它似乎失败了,因为它将它们编译为C代码。
答案 0 :(得分:9)
OpenCL C
是C99
的子集。
还有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网站上的详细信息。
答案 1 :(得分: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上找到信息,新闻,博客,视频和资源。
答案 2 :(得分:1)
作为参考,还有Boost.Compute。它对pyopencl没有帮助,但是它解决了pyopencl的许多问题,并且有一些元编程魔法,有助于在C ++中编写OpenCL内核。
This SO question(在Boost.Compute FAQ中引用)也包含对OpenCL对开发人员构成的一些相关设计约束的很好的讨论。
答案 3 :(得分:0)
这是一个古老的问题,“解决”它的工作已经进行了一段时间……
有一个由clang Clang C++ for OpenCL实现的社区驱动的OpenCL内核语言C ++,还有一个Khronos扩展cl_ext_cxx_for_opencl,它也将这种语言的在线编译功能添加到OpenCL驱动程序中。 Arm刚刚宣布了对此extension的支持。尽管也可以使用上游工具以这种语言脱机编译内核,将其编译为计算机二进制文件,SPIR-V或任何其他IR,然后在不进行任何扩展的情况下将预编译的代码加载到OpenCL驱动程序中。