2014-10-01 2 views
1

Так что я знаю, что openCL имеет множество ограничений, когда дело доходит до того, какие аргументы он может принять, передаваемые в ядро. Например, он не поддерживает типы классов C++, и структура не может иметь указатель в качестве аргумента. Однако можно ли открывать структуры поддержкиCLCL, которые имеют не указательные структуры как поля?Комплексные структуры в openCL Kernel

Например, если я сделал следующее:

typedef struct 
{ 
    int a; 
    float b; 
} MyStruct1; 

typedef struct 
{ 
    float a; 
    MyStruct1 field; 
} MyStruct2; 

__kernel void MyKernel(const MyStruct2 *struct) 
{ 
    MyStruct1 innerStruct = struct->field; 
    //Do more stuff 
} 

^^ Будет ли это законно в OpenCL? И если это законно, есть ли какие-то особые проблемы с памятью, о которых я должен знать?

+0

Вы можете попробовать скопировать два и отладки структур, если они делают глубокую копию или неглубокую один. Если он работает для нескольких структур длиной в 128 бит, вы должны использовать эти структуры. –

ответ

2

OpenCL C, который используется внутри ядер, основан на стандарте C99 с некоторыми ограничениями. Как только структура описывает только положение своих элементов в памяти, проблем с вложенными структурами нет.

OpenCL спецификации можно найти на Khronos site

3

Вложенные структуры являются законными в OpenCL, но padding is device and compiler specific. Таким образом, это приведет к проблемам, если использовать их в качестве аргумента для ядра. На некоторых системах прокладка будет различной на хосте и на устройстве, что приведет к повреждению данных. Если вы хотите использовать структуры на стороне устройства, вы всегда можете перемещать данные с помощью массивов и строить структуры на стороне устройства.

+0

Хорошо, но правильно ли структурировать другие структуры как поля? Я знаю, что структуры вообще были законными, но мне интересно об этом конкретном сценарии структур, содержащих структуры. – user1782677

+0

Я имел в виду вложенные структуры, когда я говорил о просто структурах. Я уже отредактировал ответ. – maZZZu