【问题标题】:Advantages of a program containing several OpenCL kernels versus several programs with one kernel each?包含多个 OpenCL 内核的程序与多个程序各自具有一个内核的优势?
【发布时间】:2013-11-22 02:13:37
【问题描述】:

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

如果我提前知道要合并到一个程序中的所有内核,我就没有问题 - 只需创建一个包含所有内核源代码或二进制文件的程序。

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

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

【问题讨论】:

    标签: c++ c opencl


    【解决方案1】:

    将 OpenCL 内核组合成一个程序有几个好处:

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

    2. 更显着的好处:在程序中将内核组合在一起允许它们相互引用和使用和/或其他相关的辅助函数。

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

    【讨论】:

    • 啊,有道理。因此,在内核不相互引用的情况下,涉及多个程序的解决方案因为它使主机代码更简单并不是一个疯狂的解决方案。
    • 我们实际上使用尽可能少的程序正是因为它使主机代码和内核开发对我们来说很简单。我们只需将与单个事物相关的内核写入一个 .cl 文件,将其读入内存并将其传递给 clCreateProgramWithSource。例如,我们在一个 .cl 文件中包含 FFT 内核。另一个中的 2d 卷积等。
    • @sharpneli 是的,但我发现这并非普遍适用。我的观点并不是说一般来说很少有程序不是更好,而是在我们有多个内核可能出现和消失的特定情况下,多个程序并不是一个坏方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 2011-05-30
    相关资源
    最近更新 更多