【发布时间】:2011-02-24 20:39:25
【问题描述】:
是否可以在 OpenCL 代码中定义我自己的函数,以便内核可以调用它们?是的,我在哪里可以看到一些简单的例子?
【问题讨论】:
-
老问题...您还需要回答什么?
-
标题和问题好像不一样?标题专门要求
inline,而问题只是问我们是否可以定义我们的功能......
是否可以在 OpenCL 代码中定义我自己的函数,以便内核可以调用它们?是的,我在哪里可以看到一些简单的例子?
【问题讨论】:
inline,而问题只是问我们是否可以定义我们的功能......
OpenCL 支持辅助功能。有关示例,请参见this link 的第 19 页。
【讨论】:
我用谷歌搜索了一下,然后一直回到这个问题:-P
最后,我所做的是使用宏,因为无论如何内联都是依赖于实现的,而且宏在 c99 OpenCL 程序的上下文中似乎没有任何主要缺点?例如:
#define getFilterBoardOffset( filter, inputPlane ) \
( ( filter * gInputPlanes + inputPlane ) * gFilterSizeSquared )
#define getResultBoardOffset( n, filter ) \
( ( n * gNumFilters + filter ) * gOutputBoardSizeSquared )
代替:
inline float getFilterBoardOffset( float filter, int inputPlane ) {
return ( filter * gInputPlanes + inputPlane ) * gFilterSizeSquared;
}
inline float getResultBoardOffset( float n, int filter ) {
return ( n * gNumFilters + filter ) * gOutputBoardSizeSquared;
}
【讨论】:
用于创建程序的函数是...
cl_program clCreateProgramWithSource (
cl_context context,
cl_uint count,
const char **strings,
const size_t *lengths,
cl_int *errcode_ret)
您可以像这样将函数放在 strings 参数中,
float AddVector(float a, float b)
{
return a + b;
}
kernel void VectorAdd(
global read_only float* a,
global read_only float* b,
global write_only float* c )
{
int index = get_global_id(0);
//c[index] = a[index] + b[index];
c[index] = AddVector(a[index], b[index]);
}
现在您有了一个用户定义的函数“AddVector”和一个内核函数“VectorAdd”
【讨论】:
基于代码示例here,您可以编写如下函数:
inline int add(int a,int b)
{
return a+b;
}
(例如,查看 DXTC 或双音排序示例中的 .cl 文件。)
我不知道这是否只是 nvidia 的扩展,但 OpenCL 文档谈到了“辅助功能”以及内核。
【讨论】: