2010-05-27 83 views
9

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

+0

老问题......其他任何你从一个答案需要什么? – 2011-08-09 17:06:01

+2

似乎标题和问题是不同的?标题特别要求'inline',而问题只是询问我们是否可以定义我们的函数...... – 2015-01-10 05:14:16

回答

5

基于代码样本here你可以写这样的功能:

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

(如看在DXTC或双调排序例子.cl文件中。)

我不知道这是否是nvidia唯一的扩展,但OpenCL文档讨论的是“辅助功能”以及内核。

+0

奇怪的是,OpenCL规范没有提及__device – dmessf 2010-05-27 20:35:44

+0

是的。我想知道我是否被误解了。或者如果Apple将它添加为扩展名。所以,如果你改变了我的意见,请再次调整我的意见,直到经过测试:-) – sigfpe 2010-05-27 20:42:27

+0

或...如果我对CUDA代码感到困惑。我一直在玩。 – sigfpe 2010-05-27 20:43:27

3

OpenCL支持辅助功能。有关示例,请参见this link的第19页。用于创建程序

+4

链接!=功能:( – 2011-08-09 17:04:12

+1

@Garet:谢谢。 – Yktula 2011-08-10 04:44:18

+0

Oooh,..有很多有用的信息,在一个很好的基线卡上有很好。 – 2011-08-11 21:21:19

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”

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