OpenCL - Инициализация переменных области действия программы с хоста? - PullRequest
3 голосов
/ 22 августа 2011

У меня есть некоторые общие параметры, объявленные как глобальная (__constant) структура, например:

typedef struct
{
    int a;
    int b;
    float c;
    /// blah blah

} SomeParams;

__constant SomeParams Parameters;

в ядре, мне нужно использовать его так:

__kernel void Foo()
{
    int a = Parameters.a;
    /// do something useful...
}

Я не уверен, как я могу инициализировать значение Parameters с хоста до запуска ядра.

У меня нет проблем с созданием буферов и т. Д. Для аргументов ядра, но, поскольку это не аргумент ядра,что мне нужно сделать?

Я использую привязки Cloo C # / OpenCL, но даже сырой CL API будет полезен.

1 Ответ

6 голосов
/ 22 августа 2011

Насколько я знаю (но я бы не стал этим ругаться), вы не можете инициализировать переменные из кода хоста, которые объявлены таким образом (за одним исключением, см. Ниже).Вы можете объявить переменную и инициализировать ее следующим образом:

__constant float pi = 3.14f;

Вы также можете сделать что-то вроде этого:

Ядро: __constant float width = WIDTH

Хост: Сборка ядрас параметром сборки -D, определяющим значение WIDTH.

То, что я делал в прошлом, это постоянная переменная в качестве параметра ядра.

__kernel void Foo(__constant SomeParams Parameters)
{
    int a = Parameters.a;
    /// do something useful...
}

Тогда вы можетевыделить и установить значение, как и любой другой аргумент ядра.

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