Почему битовые поля не разрешены в OpenCL? - PullRequest
6 голосов
/ 27 января 2012

Битовые поля не поддерживаются на языке OpenCL. Какова была причина не поддерживать их? В отличие от других пропущенных частей (рекурсия, указатели на функции, ...), где есть очевидная причина не поддерживать их, я не вижу ни одной для битовых полей. Я уверен, что это не недосмотр со стороны комитета, но в чем причина?

(Я храню некоторые биты, упакованные в целые числа, и код будет удобнее читать с ними. Я понимаю битовые поля как хороший синтаксис, позволяющий избежать смещения битов и маскирования взад-вперед, что в любом случае они переводят в сборку. )

Ответы [ 2 ]

9 голосов
/ 28 января 2012

Мне удалось задать этот вопрос кому-то из членов рабочей группы. Вот что он должен был сказать:

Битовые поля не переносимы - поэтому они не могли использоваться в типах, используемых для аргументов ядра.

Единственное место, где они могут использоваться, - это типы для локальных переменных объявлено внутри ядра.

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

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

В Википедии есть некоторая информация о недостатках битовых полей :

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

Я думаю, что все эти недостатки актуальны в среде OpenCL.

...