OpenCL用户定义的内联函数

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

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

 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”

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

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

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

我不知道这是否只是一个nvidia扩展,但OpenCL文档讨论了“辅助function”以及内核。

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

我用Google搜索了一下,然后不断回到这个问题:-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; }