这个问题源于我希望在运行时从各种内核构建一个OpenCL程序。所以,想象一下,我想在给定的上下文中使用相同的内存对象集执行各种内核。
如果我提前知道我想要组合成一个程序的所有内核,我就没有问题 - 只需创建一个包含所有内核源代码或二进制文件的程序。
但是,鉴于我没有提前知道我想要合并的内核,我正在考虑为每个内核源创建一个程序。这是否等同于原始情况(假设编译时选项都相同)?调用驻留在不同程序中的内核会有性能损失吗?
问题可能是我不理解“程序”的抽象。它是什么?它不仅仅是一个内核集合和一些编译时选项吗?
答案 0 :(得分:3)
将OpenCL内核分组到一个程序中有以下几个好处:
通过多次clBuildProgram()
调用多次调用编译器的(轻微)开销。通过将单个源字符串编译为单个程序,然后从中创建多个内核,可以避免这种情况。但是,在获得内核对象后,基于它来自的程序,性能应该没有差别。
更显着的好处:在程序中将内核组合在一起允许它们引用和使用彼此和/或其他相关的帮助程序函数。
示例:程序可能会定义一个在球形和笛卡尔坐标之间进行转换的函数,然后可以由多个内核使用,而不需要复制它。