【问题标题】:What are kernel blocks in OpenCL?OpenCL 中的内核块是什么?
【发布时间】:2014-08-24 05:12:46
【问题描述】:

在“如何设置 Xcode 以运行 OpenCL 代码,以及如何在构建之前验证内核”一文中,NeXTCoder 将某些代码称为“短答案”,即https://developer.apple.com/library/mac/#documentation/Performance/Conceptual/OpenCL_MacProgGuide/XCodeHelloWorld/XCodeHelloWorld.html。

在该代码中,作者说“将内核代码包装到内核块中:”而没有解释什么是“内核块”。 (Apple 的 Mac OS X 的 OpenCL 程序员指南没有提到内核块。)

主机程序调用“square_kernel”,但示例内核称为“square”,示例内核块标记为“kernelName”(斜体)。你能告诉我如何将 3 个部分放在一起:内核、内核块和主机程序以在 Xcode 5.1 中运行吗?我只有一个内核。谢谢。

【问题讨论】:

标签: opencl


【解决方案1】:

这不是真正的行话。它是类似闭包的实体。

OpenCL C 2.0 增加了对 clang 块语法的支持。您使用 ^ 运算符来声明 Block 变量并指示 Block 文字的开头。块本身的主体包含在 {} 中,如示例中所示(与 C 一样,; 表示语句的结尾)。块能够使用与定义它的范围相同的变量.

例子:

int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
    return num * multiplier;
};
printf(“%d\n”, myBlock(3));
// prints 21

来源: https://www.khronos.org/registry/cl/sdk/2.1/docs/man/xhtml/blocks.html

【讨论】:

    【解决方案2】:

    术语“内核块”似乎只是一个术语,指的是“作为内核的代码部分”。特别是,在这种情况下,内核块只是声明为内核的函数,通过在其声明之前添加kernel。或者,甚至更简单,从本网站使用该术语的方式来看,我会说“内核块”与“内核”相同。

    kernelName(斜体)是一个占位符。那里的代码显示了如何定义 any 内核的一般模式:

    • 前缀为kernel
    • 返回void
    • 它有一个名字...kernelName,例如可能是square
    • 它有几个输入和输出参数

    内核之所以被称为square,却被square_kernel调用,似乎是XCode做的一些魔术:它似乎读取了.cl文件,并创建了一个.h文件,其中包含从.cl 文件派生的附加声明(如this question 中所见,其中定义了一个名为rebound 的内核,GCL 生成了一个rebound_kernel 声明)。

    【讨论】:

    • Marco 13 对 Racker 问题的回答非常有帮助。有人可以推荐一个好的资源来学习如何使用 C++11 在 Xcode 5.1 上将 OpenCL 程序放在一起,其中包含更多的“如何”和更少的“你可以”。
    猜你喜欢
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 2011-12-06
    • 2017-11-05
    • 2015-07-19
    • 2019-04-19
    • 2018-07-20
    • 1970-01-01
    相关资源
    最近更新 更多