Мне нужно делать вычисления GPU на логическом массиве bool[]
(обратите внимание, не std::vector<bool>
), который был создан в памяти процессора (с кодом C ++ 11) и затем скопирован в GPU через cuMemCpy
или похожие.
Первый вопрос:
sizeof(bool)
сообщает 1 байт. Это гарантировано стандартом C ++ 11?
Второй вопрос:
Является true
(false
) всегда представлен как 1
(0
) (в unsigned char
представление) или у компилятора есть свобода здесь? (При желании можно использовать любое ненулевое целое число меньше 256)
Третий вопрос (специфичный для PTX):
В PTX логические операции or
, xor
и т. д. работают только для типов больше 8 бит. То есть я могу делать логические операции на unsigned int
с or.u32 <out>,<in1>,<in2>
, Однако начиная с C ++ 11 bool
тип, кажется, 8 бит это значит, я не могу работать с массивом bools
который был скопирован непосредственно из процессора в память графического процессора и, следовательно, мне нужно преобразовать массив bools
сначала в некоторый тип PTX могут работать логические операции, т.е. u32
, u16
, так далее.?
Первый ответ:
Нет, это не гарантировано. Увидеть [expr.sizeof]/1
и соответствующая сноска:
… sizeof (char), sizeof (подписанный char) и sizeof (unsigned char) равны 1. Результат sizeof, примененного к любому другому фундаментальному типу (3.9.1), определяется реализацией. [Примечание: в частности, sizeof (bool), sizeof (char16_t), sizeof (char32_t) и sizeof (wchar_t) определяются реализацией75. …
75) sizeof (bool) не обязательно должен быть 1.
Второй ответ:
Я уверен, что представление значения для bool
Объекты определены реализацией, но я не могу найти ничего, явно заявляющего об этом. Самое близкое, что я могу получить, это [basic.types]/4
:
… Для тривиально копируемых типов представление значения — это набор битов в представлении объекта, который определяет значение, которое является одним дискретным элементом набора значений, определенного реализацией.
Третий ответ:
Я не знаю, но из вашего описания, похоже, вам придется изменить типы.
Других решений пока нет …