2015-05-20 113 views
0

我想澄清OpenCL中的一些结构和语法。目前我正在使用VS2013和OpenCL Emulator-Debugger。我开始与自带的模拟器示范项目工作,并坚持到这一点:OpenCL内核定义语法

__Kernel(hello) 
__ArgNULL 
    { 
    ... 
    } 

只是上面两行有这样的:

//__kernel void 
//hello() 

什么是它们之间的区别?据我所知,从文档(这里:http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2012/10/OpenCL-Emu-Documentation-2.pdf

和这里:https://www.khronos.org/registry/cl/specs/opencl-1.x-latest.pdf)第一个只是在第二个OCL-Emu环境的宏定义,但没有一个明确的答案。这是正确的吗?

+0

内核只是一个普通的C函数(符合一系列的限制条件),其属性为__kernel。 –

+0

@ SK逻辑是的,我知道这一点。我无法弄清楚哪一个是定义一个语法的正确语法,以及我提到的上述语法之间有什么区别。 – Arkoudinos

+0

只有一个语法 - '__kernel'属性。上面的代码显然是一些奇怪的宏,首先扩展宏以查看它实际上在做什么。 –

回答

0

是的,它是正确的,第一个是宏。

__Kernel()是一个宏,而__kernel是一个特殊的CL标志,用于声明C99函数作为GPU代码输入函数(内核函数)。

所以这__Kernel(hello)扩展到__kernel hello__ArgNULL扩展到()。 给你一个正常的CL代码:__kernel hello() { ... }

在这个Emu-CL的情况下,可能需要宏,因为它没有内部扩展到CL代码。这些宏是一种简化和适应CL语言表达的方式。