【问题标题】:Passing a function as an argument in OpenCL在 OpenCL 中将函数作为参数传递
【发布时间】:2018-07-09 16:16:48
【问题描述】:

是否可以在 OpenCL 1.2 中将函数指针传递给内核?我知道它可以在 C 中完成,但我不知道如何在 OpenCL 的 C 中完成。

编辑: 我想做与这篇文章中描述的相同的事情:How do you pass a function as a parameter in C?,但针对内核。

以前,我使用内联函数从内核调用它们,但我希望该函数是一个参数,而不是硬编码。

【问题讨论】:

  • 传递一个指针并用它做一些有用的事情是不同的事情。请展示您拥有的 C 代码(包括指针的使用),并详细说明实际目的以使这个问题不那么广泛。
  • 您可以编译多个版本的内核并调用正确的版本。
  • @theoden 这是目前的解决方案,我只是在寻找更通用的方法。
  • @aabceh 那我就用sycl,我不知道还有什么办法。
  • 没有。这是不可能的。

标签: c opencl c99


【解决方案1】:

短:

OpenCL 的 C != C,将其视为语法帮助,它的大部分看起来像 c,但它并没有涵盖所有语言细节并将其扩展到某个点并且它不提供(参见第 233 页的规范) , 6.9 a: https://www.khronos.org/registry/OpenCL/specs/opencl-1.2.pdf)

因此,你不能这样做。

详细

在 C 中传递函数指针是一种结构化代码以优化逻辑的方法。另一方面,内核不是构建事物的重点,而是优化您编码的每一行以达到最大可能效率的重点。最后,所有内容都将组合成一个程序,每个线程都将执行该程序,并且您调用的每个函数都将被内联(您没有 CPU 上的调用堆栈)。

因此,在这种情况下,您需要重新考虑您希望在 C 中实现的程序逻辑,以便针对一个或多个内核调用对其进行优化,从而消除函数指针方法。为您的函数指针方法优化它最终会导致可读性问题、性能问题或code smell

【讨论】:

    【解决方案2】:

    你可以将任何数据传递给内核,但你不能从内核调用该函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-13
      • 2023-04-02
      • 2022-01-14
      • 2011-02-13
      • 2013-08-25
      • 2016-02-16
      相关资源
      最近更新 更多