OpenCL中的内核块是什么?

时间:2014-08-24 05:12:46

标签: opencl

在文章"如何设置Xcode以运行OpenCL代码,以及如何在构建之前验证内核" NeXTCoder将一些代码称为" Short Answer",即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中运行?我只有一个内核。感谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:-1)

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

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

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

内核被调用square,但用square_kernel调用的原因似乎是XCode所做的一些魔术:它似乎读取了.cl文件,并创建了一个.h文件,其中包含从.cl文件派生的其他声明(如this question中所示,其中定义了名为rebound的内核,并且GCL生成了{ {1}}声明)。