Мне нужна помощь в понимании выравнивания данных в буферах OpenCL - PullRequest
3 голосов
/ 25 января 2012

Учитывая следующую структуру

typedef struct
{
   float3 position;
   float8 position1;
} MyStruct;

Я создаю буфер для передачи его в качестве указателя на ядро, буфер будет иметь предыдущий формат буфера.

Я понимаю, что мне нужно добавить 4 байта в буфер после записи трех чисел с плавающей запятой, чтобы получить следующую степень двух (16 байтов), но я не понимаю, почему мне нужно добавить еще 16 байтов перед записью байты позиции1. В противном случае я получаю неправильные значения в position1.

Может кто-нибудь объяснить мне, почему?

1 Ответ

5 голосов
/ 25 января 2012

Число с плавающей запятой8 - это вектор из 8 чисел с плавающей запятой, каждая из которых имеет размер 4 байта. Это делает размер 32 байта. В соответствии с разделом 6.1.5 спецификации OpenCL 1.2 , Выравнивание типов, типы всегда выровнены по их размеру; поэтому float8 должен быть выровнен на 32 байта. Этот же раздел также говорит нам, что float3 занимает 4 слова. Кроме того, поскольку sizeof для структуры организован так, чтобы разрешать массивы структуры, он не будет отказываться от переупорядочения этих конкретных полей. На более сложных структурах вы можете сэкономить место, оставив меньшие поля вместе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...