Как объявить функцию внутри функции ядра в OpenCL? - PullRequest
4 голосов
/ 14 июня 2011

Я хочу определить функцию внутри функции ядра, чтобы сделать мой код индексации более понятным:

kernel void do_something (const int some_offset,
                          const int other_offset,
                          global float* buffer)
{
    int index(int x, int y)
    {
        return some_offset+other_offset*x+y;
    }

    float value = buffer[index(1,2)];
    ...
}

В противном случае я должен был бы объявить функцию индекса вне моего ядра и индексировать как

float value = buffer[index(1,2,some_offset,other_offset)];

, что сделало бы это более уродливым и т.д. Есть ли способ сделать это? Компилятор выдает ошибку:

OpenCL Compile Error: clBuildProgram failed (CL_BUILD_PROGRAM_FAILURE).
Line 5: error: expected a ";"

Можно ли делать то, что я хочу, или есть другой способ добиться того же? Спасибо!

1 Ответ

5 голосов
/ 14 июня 2011

C не поддерживает вложенные функции.Однако ваш случай достаточно прост, чтобы быть реализованным с помощью макроса:

#define index(x,y) some_offset+other_offset*(x)+(y)

Скобки вокруг x и y имеют решающее значение, чтобы заставить макрос делать то, что вы хотите, если вы передадите ему более сложные выражения, например, index(a+b,c).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...