2012-06-22 2 views
3

У меня возникают проблемы с передачей структуры векторов в ядро ​​OpenCL.Как OpenCL floatn отличается от настраиваемой структуры

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

typedef struct { 
    cl_float4 vec; 
} my_type; 

. , , к ядру, если я заявляю это как:

typedef struct { float s[4]; } my_float4; 
typedef struct { my_float4 vec; } my_type; //use custom float4 
__kernel void function(const my_type test) {} 

. , , но, если я заявляю, что нравится:

typedef struct { float4 vec; } my_type; //use built-in float4 
__kernel void function(const my_type test) {} 

Так что мой вопрос, что делает float4 отличается и особенным? Во втором примере я получаю CL_INVALID_ARG_SIZE в clSetKernelArg. В главном коде я использую cl_float4 - не так ли предположил, что должен быть сопряжен с float4 в ядре?


EDIT: по запросу clSetKernelArg код (обработка ошибок обрезается):

template <typename type_data> void set_argument(int arg_index, const type_data* data) { 
    cl_int err = clSetKernelArg(kernel,arg_index,sizeof(type_data),data); 
    if (err!=CL_SUCCESS) throw "ERROR"; /*simplified*/ 
} 

я называю функцией с структуры объявлены точно, как описано выше:

my_type test; 
my_kernel->set_argument(0,&test); 
+0

Можете ли вы показать точный вызов clSetKernelArg и связанный с ним код? Вероятно, это проблема выравнивания структуры, но трудно сказать, не видя кода. – talonmies

+0

Добавлена ​​функция. Структура уже является точным кодом. – imallett

+0

Все еще отсутствует экземпляр шаблона ..... – talonmies

ответ

3

Это звучит как ошибка с вашей реализацией - вы должны иметь возможность передать этот пользовательский тип в ядро ​​без проблем. Какую платформу/SDK вы используете? Я был в состоянии успешно объявить этот тип в коде хоста:

typedef struct _mytype { 
    cl_float4 val; 
} mytype; 

... а затем использовать его:

mytype t; 
status = clSetKernelArg(kernel, argc++, sizeof(mytype), &t); 
check_status("clSetKernelArg:mytype t", status); 

Где check_status делает то, что можно было ожидать: чеки для не- CL_SUCCESS возвращаемое значение.

Ядро выглядит следующим образом:

typedef struct _mytype { 
    float4 value; 
} mytype; 

kernel void do_it(/* ... */, const mytype test) { /* ... */ } 

Это компилирует и выполняет, давая правильные результаты на устройстве процессора.

+0

Хммм, я попробовал этот точный пример, и он сработал. Затем я не смог воспроизвести свою проблему с тем же кодом, который я использовал раньше. Тем не менее, я столкнулся с другой проблемой - вы не можете смешивать cl_float3 и cl_float. Я понял, что вам нужно четыре поплавка (выравнивание), которые исправили его. Так . , , не знаю, в чем была оригинальная проблема: S Спасибо, что помогли мне! – imallett

Смежные вопросы