将内核全局缓冲区传递给OpenCL中的本地函数

时间:2013-11-11 11:01:31

标签: opencl

假设我们有一个内核函数:

kernel void function(global const float* a, global const float* b, global float* c, int nElements)
{
...
c[gid] = a[gid] * b[gid];
}

但是想要将大型复杂内核分解为几个较小的函数。如何将全局缓冲区传递给这些较小的函数?

如果我执行以下操作,则会出现“隐式声明函数'cl_axpbyr'形式在OpenCL中无效”的错误:

kernel void function(global const float* a, global const float* b, global float* c, int     nElements)
{
...
cl_axpbyr(1.0f, a, c, nElements);
}

inline void cl_axpy(float alpha, global const float* x, global float* y, int nElements)
{
int gid = get_global_id(0);
if (gid >= nElements)
 {
      return;
 } 
y[gid] = alpha*x[gid] + y[gid];
}

1 个答案:

答案 0 :(得分:1)

首先你称之为:

cl_axpbyr(1.0f, a, c, nElements);

虽然您的功能是:

inline void cl_axpy

您应该调用cl_axpy而不是cl_axpbyr

其次,OpenCL内核语言只是C.因此,如果要在要调用它们的位置之后定义它们,则需要预先声明您的函数。以下代码干净利落地编译:

// This is the normal C style function declaration which must exist
inline void cl_axpy(float alpha, global const float* x, global float* y, int nElements);


kernel void function(global const float* a, global const float* b, global float* c, int     nElements)
{
cl_axpy(1.0f, a, c, nElements);
}


inline void cl_axpy(float alpha, global const float* x, global float* y, int nElements)
{
int gid = get_global_id(0);
if (gid >= nElements)
  {
      return;
  } 
y[gid] = alpha*x[gid] + y[gid];
}

您也可以将整个cl_axpy放在内核定义之前。两种方式都很好。