9

是否可以在 OpenCL 代码中定义我自己的函数,以便内核可以调用它们?是的,我在哪里可以看到一些简单的例子?

4

4 回答 4

13

用于创建程序的函数是...

cl_program clCreateProgramWithSource  (     
    cl_context context,
    cl_uint count,
    const char **strings,
    const size_t *lengths,
    cl_int *errcode_ret)

您可以像这样将函数放在字符串参数中,

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”

于 2010-08-01T23:42:10.330 回答
5

根据此处的代码示例,您可以编写如下函数:

inline int add(int a,int b)
{
   return a+b;
}

(例如,查看 DXTC 或双音排序示例中的 .cl 文件。)

我不知道这是否是仅 nvidia 的扩展,但 OpenCL 文档谈到了“辅助功能”以及内核。

于 2010-05-27T20:33:20.403 回答
3

OpenCL 支持辅助功能。有关示例,请参见此链接的第 19 页。

于 2010-05-27T21:10:46.947 回答
2

我用谷歌搜索了一下,然后一直回到这个问题:-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; 
}
于 2015-01-10T05:13:28.473 回答