2010-05-27 3 views
9

Возможно ли определить мои собственные функции в коде OpenCL, чтобы ядра могли их называть? Это да, где я могу увидеть простой пример?Определенные пользователем встроенные функции OpenCL

+0

Старый вопрос ... все остальное вам нужно от ответа? –

+2

Кажется, что название и вопрос разные? Название конкретно запрашивает 'inline', тогда как вопрос просто спрашивает, можем ли мы определить наши наши функции ... –

ответ

5

на основе образцов кода here вы можете просто написать такие функции, как:

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

(Например, посмотрите на .cl файла в DXTC или bitonic примеров сортировки.).

Я не знаете, что это только расширение nvidia, но в документации OpenCL говорится о «вспомогательных функциях», а также о ядрах.

+0

Странно, спецификация OpenCL ничего не говорит о __device – dmessf

+0

Да. Мне интересно, не ошибаюсь ли я. Или Apple добавила его в качестве расширения. Так что, если вы меня модифицировали, измените меня до тех пор, пока он не будет протестирован :-) – sigfpe

+0

Или ... если я запутаюсь с кодом CUDA. Я играл с обоими. – sigfpe

3

OpenCL поддерживает вспомогательные функции. См. Стр. 19 из this link.

+4

Ссылка: = функциональный :( –

+1

@ Garet: Спасибо. – Yktula

+0

Ух, там есть много полезной информации о хорошей базовой карте. Хорошая. –

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