一个包含多个OpenCL内核的程序相对于多个分别包含一个内核的程序的优势

Advantages of a program containing several OpenCL kernels versus several programs with one kernel each?

本文关键字:内核 程序 包含一 相对于 OpenCL 包含多 一个      更新时间:2023-10-16

这个问题源于我希望在运行时从各种内核构建一个OpenCL程序。所以,想象一下,我有各种内核,我想在给定的上下文中用相同的内存对象集执行它们。

如果我提前知道我想组合成一个程序的所有内核,我就没有问题了——只需创建一个包含所有内核源代码或二进制文件的程序。

然而,考虑到我不知道我想提前组合哪些内核,我正在考虑为每个内核源创建一个程序。这是否等同于原始情况(假设编译时选项都相同)?调用驻留在不同程序中的内核会对性能造成影响吗?

问题可能是我不理解"程序"的抽象。它是什么?它不仅仅是内核和一些编译时选项的集合吗?

将OpenCL内核分组到一个程序中有几个好处:

  1. 通过多个clBuildProgram()调用多次调用编译器的(轻微)开销。这可以通过将一个源字符串编译到一个程序中,然后从中创建多个内核来避免。但是,在获得内核对象后,它所来自的程序的性能应该没有差异。

  2. 更显著的好处是:在程序中将内核分组在一起,使它们能够引用并使用彼此和/或其他相关的辅助函数。

    示例:一个程序可以定义一个函数来在球面坐标和笛卡尔坐标之间转换,然后可以由多个内核使用,而无需复制其源。