Как сказал Роджер, да, CUDA обеспечивает те же побитовые операции (т. е. >>
, <<
и &
), что и обычный C, поэтому вы можете реализовать свой битовый массив практически нормально (почти, см. вопросы синхронизации потоков ниже).
Однако для вашей ситуации это почти наверняка не очень хорошая идея.
Есть проблемы с синхронизацией потоков. Представьте, что два потока вашего графического процессора инвертируют два бита одной записи вашего массива. Каждый поток будет считывать одно и то же значение из памяти и применять к нему свою операцию, но поток, который записывает свое значение обратно в память последним, перезапишет результат другого потока. (Примечание: если ваш битовый массив не модифицируется кодом графического процессора, это не проблема.)
И, если это явно не требуется, вы не должны оптимизировать использование памяти, массив с 10 КБ элементов вообще не занимает много памяти: даже если вы храните каждое логическое значение в 64-битном целом числе это всего 80 КБ. И, очевидно, вы можете хранить их в меньшем типе данных. (Вы должны начать беспокоиться о максимально возможном сжатии массива только тогда, когда вы получаете десятки миллионов или даже сотни миллионов элементов.)
Кроме того, способ работы графических процессоров означает, что вы можете получить лучшую производительность, используя достаточно большой тип данных для каждого логического значения (скорее всего, 32-битного), чтобы, например, объединение памяти работало лучше. (Я не проверял это утверждение, вам нужно будет запустить несколько тестов, чтобы проверить его.)
person
huon
schedule
15.06.2012