2010-05-27 87 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; 
}