Возможно ли определить мои собственные функции в коде OpenCL, чтобы ядра могли их называть? Это да, где я могу увидеть простой пример?Определенные пользователем встроенные функции OpenCL
ответ
на основе образцов кода here вы можете просто написать такие функции, как:
inline int add(int a,int b)
{
return a+b;
}
(Например, посмотрите на .cl файла в DXTC или bitonic примеров сортировки.).
Я не знаете, что это только расширение nvidia, но в документации OpenCL говорится о «вспомогательных функциях», а также о ядрах.
Странно, спецификация OpenCL ничего не говорит о __device – dmessf
Да. Мне интересно, не ошибаюсь ли я. Или Apple добавила его в качестве расширения. Так что, если вы меня модифицировали, измените меня до тех пор, пока он не будет протестирован :-) – sigfpe
Или ... если я запутаюсь с кодом CUDA. Я играл с обоими. – sigfpe
Функция используется для создания программы ...
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»
Я немного погумил и просто возвращался к этому вопросу :-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;
}
Старый вопрос ... все остальное вам нужно от ответа? –
Кажется, что название и вопрос разные? Название конкретно запрашивает 'inline', тогда как вопрос просто спрашивает, можем ли мы определить наши наши функции ... –