У меня есть входной массив, который передается ядру. Каждый поток работает с одним значением массива и либо изменяет значение, либо не изменяет его вообще в соответствии с правилом.Эмуляция std :: bitset в CUDA
Я бы хотел узнать об этом очень быстро, если бы произошли какие-либо изменения во входной памяти, и, если бы это было так, я бы очень быстро нашел, где произошло это изменение (индекс входного массива).
Я думал об использовании чего-то вроде массива бит. Общее количество бит будет равно общему количеству потоков. Каждый поток будет манипулировать только одним битом, поэтому изначально биты будут установлены на false, если поток изменит соответствующее входное значение, бит станет истинным.
Для того, чтобы сделать его более ясным, давайте предположим, что у нас есть этот входной массив называется A
1 9 3 9 4 5
Массив битов будет следующие
0 0 0 0 0 0
Таким образом, мы имели бы 6 нитей рабочих на входном массиве. Давайте предположим, что конечный массив ввода будет
1 9 3 9 2 5
Таким образом, окончательный массив битов будет:
0 0 0 0 1 0
Я не хочу использовать массив bool
, потому что каждое из значений будет принимать 1 байт памяти, что довольно много, так как я хочу работать только с битами.
Можно ли добиться чего-то подобного?
Я думал о создании массива char
, где каждое значение массива будет иметь 8 бит. Однако, что, если два потока хотели бы изменить разные биты первого символа массива? Им придется выполнять операцию атомарно, даже если изменение внутри бит будет осуществляться в разных местах. Таким образом, использование атомных операций, вероятно, нарушит параллелизм, и в этом случае использование атомных операций не требуется, это не имеет никакого смысла, но должно быть использовано из-за ограничений использования массива символов вместо чего-то более специализированного как std::bitset
Спасибо заранее.
Этот вопрос очень похож на твой: http://stackoverflow.com/questions/11042816/how-to-create-large-bit-array -in-cuda – BenC
Спасибо, я прочитал вопрос и ответ, однако он ничего не говорит о том, как я могу использовать массив бит или если в CUDA есть что-то вроде 'std :: bitset'. Использование массива 'bool' для меня не очень хорошо, потому что я не могу использовать слишком много памяти в графическом процессоре. – ksm001