Определяемые пользователем встроенные функции OpenCL - PullRequest
9 голосов
/ 28 мая 2010

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

Ответы [ 4 ]

13 голосов
/ 02 августа 2010

Функция, использованная для создания программы ...

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»

5 голосов
/ 28 мая 2010

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

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

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

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

3 голосов
/ 28 мая 2010

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

2 голосов
/ 10 января 2015

Я немного погуглил и продолжал возвращаться к этому вопросу: -P

В конце концов, что я сделал, так это использовал макросы, поскольку в любом случае встраивание будет зависеть от реализации, и макросы, похоже, не имеют каких-либо серьезных недостатков в контексте программ OpenCL c99? например:

#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; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...