2011-06-14 91 views
4

我想定义内核函数中的一个函数,使我的索引代码更清晰:如何在OpenCL的内核函数中声明一个函数?

kernel void do_something (const int some_offset, 
          const int other_offset, 
          global float* buffer) 
{ 
    int index(int x, int y) 
    { 
     return some_offset+other_offset*x+y; 
    } 

    float value = buffer[index(1,2)]; 
    ... 
} 

否则,我必须声明索引功能,我的内核和指数外像

float value = buffer[index(1,2,some_offset,other_offset)]; 

这会使它更丑陋等有什么办法做到这一点?编译器给我一个错误,他说:

OpenCL Compile Error: clBuildProgram failed (CL_BUILD_PROGRAM_FAILURE). 
Line 5: error: expected a ";" 

是否可以做我想做的还是有不同的方式来达到同样的? 谢谢!

+1

C没有任何形式的闭包。我假设OpenCL也没有,但是因为它(最初)是Apple的东西,请检查是否可以使用[blocks](http://en.wikipedia.org/wiki/Blocks_%28C_language_extension%29)。否则,在这种情况下,看起来好像你*可以*使用宏,因为你的'some_offset'仍然在范围内。 – 2011-06-14 12:17:34

回答

5

C不支持嵌套函数。然而,你的情况是很简单的用宏来实现:

#define index(x,y) some_offset+other_offset*(x)+(y) 

围绕x和y括号是使宏做你想做的,如果你把它传递更多复杂的表达式是至关重要的,例如,index(a+b,c)

+0

听起来不错。我是否必须在我的内核函数中定义宏,或者在我定义它的位置无关紧要吗? – 2011-06-14 13:13:34

+1

在C中,预处理是编译之前发生的单独编译阶段。所以你可以在第一次使用之前在任何地方定义它。 (也许OpenCL有更多的限制。) – zvrba 2011-06-14 13:27:11

+3

你也应该把parens放在整个表达式中:'(some_offset + other_offset *(x)+(y))'。否则'index(x,y)* 2'确实令人惊讶。 – 2011-06-14 22:34:15