Как избежать выравнивания данных в OpenCL - PullRequest
2 голосов
/ 23 января 2012

Мне нужно передать сложный тип данных в OpenCL в качестве буфера, и я хочу (если возможно) избежать выравнивания буфера.

В OpenCL мне нужно использовать две структуры для дифференциации данных, передаваемых вприведение к ним буфера:

typedef struct
{
   char a;
   float2 position;
} s1;

typedef struct
{
   char a;
   float2 position;
   char b;
} s2;

Я определяю ядро ​​следующим образом:

__kernel void 
Foo(
   __global const void* bufferData,
   const int amountElements // in the buffer
)
{
   // Now I cast to one of the structs depending on an extra value
   __global s1* x = (__global s1*)bufferData;

}

И оно работает хорошо только при выравнивании данных, передаваемых в буфер.

Вопрос: есть ли способ использовать атрибут _ _ ((упакованный)) или _ атрибут _ ((выровненный (1))) чтобы избежать выравнивания данных, передаваемых в буфер?

1 Ответ

1 голос
/ 23 января 2012

Если заполнение структуры меньшего размера не вариант, я предлагаю передать другой параметр, чтобы ваша функция ядра знала, какой тип - возможно, просто размер элементов.

Поскольку у вас есть типы данных, которые имеют размер 9 и 10 байт, возможно, стоит попробовать добавить их до 12 байт в зависимости от того, сколько из них вы прочитали в вашем ядре.

Что-то еще, что вас может заинтересовать, это расширение: cl_khr_byte_addressable_store http://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/cl_khr_byte_addressable_store.html

обновление: Я не осознавал, что вы передаете смешанный массив, я думал, что он был однородным по типу. Если вы хотите отслеживать тип для каждого элемента, вы должны передать список типов (или кодов). Использование float2 самостоятельно в bufferData, вероятно, также будет быстрее.

__kernel void 
Foo(
   __global const float2* bufferData,
   __global const char* bufferTypes,
   const int amountElements // in the buffer
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...