2014-10-16 2 views
0

Итак, я хочу определить структуру, которая может использоваться как на хосте, так и на устройстве в openCL, который использует встроенные типы данных openCL float4.cl_float4 на хосте и float4 на устройстве в openCL

На стороне хоста структура имеет тип cl_float4, но на устройстве это просто float4.

Так что, если я создаю-структуру, как это ...

typedef struct 
{ 
    cl_float4 a, b; 
} MyStruct; 

... и затем попытаться передать эту структуру в ядро ​​(через буфер) Я получаю сообщение об ошибке.

Если я объявляю его следующим образом ...

... что будет работать на устройстве, но не работает на хосте.

Итак, есть ли способ получить его, чтобы я мог использовать openCLs, встроенные в векторные типы по обе стороны моей программы в рамках одной и той же структуры?

ответ

4

Препроцессор C может помочь вам здесь, обработав код по-разному в зависимости от того, компилируется ли он на хосте или устройстве.

Вот некоторые возможные решения:


typedef struct 
{ 
#ifdef __OPENCL_C_VERSION__ 
    float4 
#else 
    cl_float4 
#endif 
     a, b; 
} MyStruct; 

или:

#ifdef __OPENCL_C_VERSION__ 
typedef float4 cl_float4; 
#endif 

typedef struct 
{ 
    cl_float4 a, b; 
} MyStruct; 

или:

#ifndef __OPENCL_C_VERSION__ 
typedef cl_float4 float4; 
#endif 

typedef struct 
{ 
    float4 a, b; 
} MyStruct; 

или просто использовать cl_float4 и компилировать код OpenCL, как это:

clBuildProgram(program, 1, &device, "-Dcl_float4=float4", NULL, NULL); 

+0

Макрос __OPEN_CL_C_VERSION__ не работает. Моя структура объявлена ​​в файле .h, который я передаю в clProgram, используя clCreateProgramWithSource. Когда я включаю «#ifndef __OPENCL_C_VERSION typedef cl_float4 float4 #endif», мой код ядра (файлы .cl) создает ошибку компилятора, говоря, что он не распознает cl_float4, что странно, потому что, поскольку я помещаю в макрос, он не должен даже видеть, что. __OPENCL_C_VERSION__ не универсальный макрос? Пытаться выполнить флаг компилятора в clBuildProgram также не работает. – user1782677

+0

Да, '__OPENCL_C_VERSION__' обязательно должен определяться каждым компилятором OpenCL.Какую платформу/устройство вы используете? – jprice

+0

Я нахожусь в macbook pro. Intel, графический процессор Intel HD Graphics 4000 и графический процессор NVIDIA GeForce GT 650m. Использование openCL версии 1.2, и я строю на Xcode. – user1782677

0

Я бы избежать такой подход, если вы не очень осторожны с определением структуры. Правила выравнивания структуры данных вашей архитектуры OpenCL могут очень отличаться от правил архитектуры вашего хоста OpenCL. См. this Wikipedia article для обзора выравнивания структуры данных.

TLDR: размер вашей структуры может варьироваться от устройства к хосту, так же как и смещения от каждого члена структуры от начала структуры. Если это произойдет, ваша программа сломается. Даже если вы уйдете с этим в текущую комбинацию хоста/устройства, не гарантируется работа с другими аппаратными комбинациями.

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