跳到主要内容

Khronos博客

OpenCL 3.0规范最终确定,最初的Khronos开源OpenCL SDK发布

今天,Khronos®OpenCL™工作组很高兴地宣布OpenCL 3.0规范包括一个新的统一OpenCL C 3.0语言规范,以及一个早期的Khronos OpenCL SDK初始版本,使开发人员能够快速使用OpenCL。

2020年4月,工作组宣布临时OpenCL 3.0规范的发布演示以及IWOCL的小组会议。Khronos在公共GitHub上放置了尽可能多的关于规范和一致性测试的信息,以使开发人员社区能够在规范和一致测试最终确定之前提供输入和反馈。自那时以来,工作组一直在努力将内部和外部输入集成到新的统一OpenCL 3.0规范中,提高一致性测试套件的整体覆盖率,并确保OpenCL 3.0's新灵活性的可靠运行。

图1。OpenCL工作组将Khronos公共GitHub中的信息最大化,以加速OpenCL 3.0的最终确定

OpenCL 3.0的核心和灵魂

OpenCL 3.0使硬件供应商能够将资源集中在客户需要的功能上,从而使OpenCL生态系统更加灵活。这是通过将OpenCL1.2以外的所有功能分割为可在API中查询的可选功能来实现的,并使用宏指示是否存在可选的OpenCL C语言功能。这种灵活性为新的扩展奠定了基础,这些扩展变得非常有用,可以增量集成到新的OpenCL核心规范中,以供普遍采用。

开发人员会发现,通过统一的规范,OpenCL 3.0更易于使用,该规范在一个文档中描述了OpenCL的所有版本,而不是每个版本单独的规范,这使得开发人员更容易导航并简化规范修复和澄清。统一的OpenCL 3.0规范还描述了规范发展背后的基本原理。

这个OpenCL 3.0规范的来源在Khronos GitHub上托管,以便于访问,OpenCL工作组欢迎社区错误报告和请求,以帮助改进规范文本,使OpenCL社区中的每个人都受益。因为OpenCL规范现在在所有版本中都是统一的,所以继续以旧版本(如OpenCL1.2)为目标的开发人员也可能会提交规范错误报告和请求。

图2。这个OpenCL 3.0参考指南可以下载为PDF和硬拷贝版本在线订购

最后,但同样重要的是,OpenCL 3.0规范包括两个新的扩展:

  • 返回OpenCL驱动程序和设备的通用唯一标识符(UUID)的查询,可用于跨进程或API识别驱动程序和装置。
  • 异步DMA扩展使有序DMA事务成为一流的公民,非常适合于需要对缓冲区分配进行细粒度控制的基于Scratch Pad Memory的设备。这个扩展是OpenCL中几个重要的即将到来的进步中的第一个,这些进步旨在增强对嵌入式处理器的支持。

OpenCL工作组已经开始工作在clang/llvm上游添加对OpenCL 3.0的支持.

将应用程序移至OpenCL 3.0

现在OpenCL 3.0已经完成;OpenCL 3.0实现将很快开始发布。将运行在任何旧版本OpenCL上的现有应用程序移动到OpenCL 3.0是很简单的。

使用OpenCL 1.2的应用程序将在任何OpenCL 3.0设备上无需更改代码即可运行,因为所有OpenCL 1.0功能都可以在任何OpenCL 3.0驱动程序上运行。

如果OpenCL 3.0驱动程序支持应用程序使用的所有功能,OpenCL 2.X应用程序也将继续在OpenCL 1.0上运行,并且不会更改代码。如果您正在将其驱动程序从2.X升级到3.0的设备上运行,预计所有功能都将继续受支持,因此无需更改应用程序。

强烈建议希望在多个OpenCL 3.0设备上可移植运行并使用OpenCL 2.X级功能的应用程序进行查询,以确保功能可用。可以查询所有OpenCL 2.X API功能,OpenCL C 3.0宏指示是否存在可选的语言功能。

OpenCL软件开发工具包

与OpenCL 3.0规范一起,工作组发布了一个早期的初始KhronosOpenCL软件开发工具包开发人员可以使用它轻松开始OpenCL编码。SDK是根据Apache 2.0许可证在Khronos GitHub上开源的,将不断更新和扩展。

此初始SDK版本包含一个新的OpenCL指南、标题,包括供应商扩展、一些小示例程序,以说明如何使用SDK构建系统(带CI),以及一个即将支持可安装开发层的ICD加载器。

使用OpenCL 3.0的C++内核

使用OpenCL 3.0,OpenCL工作组已经从OpenCL 2.1中首次定义的原始OpenCL C++内核语言过渡过来,并推荐开发的社区用于OpenCL的C++开源前端编译器,为那些希望使用C++17编写内核程序的开发人员提供了改进的功能和与OpenCL C的兼容性。

OpenCL的C++受叮当声并使用有限责任公司编译器基础结构。它在Clang中的实施可以通过OpenCL支持页面它使开发人员能够在OpenCL内核中使用大多数C++17功能,并通过离线编译在越来越多的OpenCL实现所采用的SPIR-V中间表示中生成代码。

C++for OpenCL将OpenCL和C++17的功能结合在一起

OpenCL C代码是有效的,并且与C++for OpenCL编译器完全兼容。这使开发人员能够在从纯OpenCL C逐步过渡到为其应用程序使用C++17功能时使用一致的前端编译器。

OpenCL 3.0cl_ext_cxx用于铅笔该扩展增加了对构建使用C++for OpenCL编写的程序的支持。它还允许应用程序查询设备编译器支持的语言版本。

C++for OpenCL在必要时生成SPIR-V 1.0和SPIR-V1.2。添加了实验支持叮当声9中的错误修复和改进叮当声10。您可以在中查看OpenCL的C++编译器资源管理器.

展望未来

OpenCL3.0规范和一致性测试的发布为即将发布的符合OpenCL3.0实现奠定了基础。工作组现在还可以定期对规范进行维护更新,并推动开发一个活动的OpenCL路线图,在将扩展添加到未来的核心规范之前,这些扩展将用于证明新功能。

已经在开发过程中的一些扩展包括:

  • 扩展子组
  • 扩展调试信息
  • 外部内存共享
  • Vulkan/OpenCL互操作

OpenCL工作组正在考虑的一些长期设计方向包括:

  • 可记录命令缓冲区
  • 机器学习原语
  • 间接派遣
  • 设备拓扑
  • 统一共享内存
  • 全球壁垒

这与不断提高OpenCL应用程序部署灵活性的工作是并行的,例如通过Googleclspv病毒可以从OpenCL C内核源代码生成Vulkan SPIR-V着色器的开放源码。

OpenCL工作组欢迎您继续对GitHub的反馈对于新功能请求和用例,以及您希望看到哪些当前可选功能和扩展在未来成为必需的,请让我们知道我们如何使OpenCL对您更有用!

评论