0

カーネル関数があるとします:

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];
}
4

1 に答える 1

1

まず、これを次のように呼び出します。

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

あなたの機能は次のとおりです。

inline void cl_axpy

cl_axpbyr の代わりに cl_axpy を呼び出す必要があります

次に、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 全体を配置することもできます。どちらの方法でも問題なく動作します。

于 2013-11-11T11:15:08.567 に答える