У меня возникают проблемы с передачей структуры векторов в ядро 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);
Можете ли вы показать точный вызов clSetKernelArg и связанный с ним код? Вероятно, это проблема выравнивания структуры, но трудно сказать, не видя кода. – talonmies
Добавлена функция. Структура уже является точным кодом. – imallett
Все еще отсутствует экземпляр шаблона ..... – talonmies