Если заполнение структуры меньшего размера не вариант, я предлагаю передать другой параметр, чтобы ваша функция ядра знала, какой тип - возможно, просто размер элементов.
Поскольку у вас есть типы данных, которые имеют размер 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
)