Size: a a a

2020 September 19

АК

Александр Караев... in pro.cxx
Anatoly Tomilov
sizeof(std::bitset<1>) == 8 при -m64 в libc++/libstdc++. sizeof(std::bitset<65>) == 16. Такие классы не принято оптимизировать, я смотрю.
Спрошу иначе - какой размер ты ожидал от этих типов? 1 и 9?
источник

AT

Anatoly Tomilov in pro.cxx
(size + 7) % 8 до 64, а дальше (size + 63) % 64 * 8
источник

АК

Александр Караев... in pro.cxx
Anatoly Tomilov
(size + 7) % 8 до 64, а дальше (size + 63) % 64 * 8
Ну и получится, что внутри того же count() помимо цикла до N*8 будет лишний if в конце для остатка
источник

AT

Anatoly Tomilov in pro.cxx
Александр Караев
Ну и получится, что внутри того же count() помимо цикла до N*8 будет лишний if в конце для остатка
все  операции над bitset могут быть реализованы без циклов. popcnt можно применить к 16, 32, 64 битам на x64.
источник

AZ

Alexander Zaitsev in pro.cxx
Anatoly Tomilov
все  операции над bitset могут быть реализованы без циклов. popcnt можно применить к 16, 32, 64 битам на x64.
что делать не на x64?
источник

AT

Anatoly Tomilov in pro.cxx
везде есть popcnt)
источник

AT

Anatoly Tomilov in pro.cxx
в constexpr, имеете ввиду?
источник

AZ

Alexander Zaitsev in pro.cxx
Anatoly Tomilov
везде есть popcnt)
а я вот не уверен. в условном каком-нибудь мипсе оно есть?
источник

AT

Anatoly Tomilov in pro.cxx
там — хоть что. Я бы через while ((x &= (x - 1))) ++count; сделал
источник

АК

Александр Караев... in pro.cxx
Anatoly Tomilov
все  операции над bitset могут быть реализованы без циклов. popcnt можно применить к 16, 32, 64 битам на x64.
Я имел в виду ситуацию, когда у тебя 64*N бит - цикл, на каждой итерации которого строго 64 бита обрабатывается. Если округлять хранилище бит до кратного 64, то цикла всегда достаточно. Если же не округлять, после цикла будет иф с проверкой, не осталось ли "хвоста"
источник

AT

Anatoly Tomilov in pro.cxx
я бы сделал через этот же while и для остатка байт доп цикл. Всё это нормально оптимизируется в popcnt
источник

AT

Anatoly Tomilov in pro.cxx
развёртывание цикла с константным количеством итераций — это наверное с 60-х годов умеют компиляторы
источник

m

magras in pro.cxx
Замени size_t на char и посмотри что выйдет: https://godbolt.org/z/GP78jv

@smertig об этом и говорит - если оперировать блоками по 64 бита это легко оптимизируется. Если блоки по 8 бит, нужно будет хвост обрабатывать отдельно, так как компилятор не справляется.
источник

m

magras in pro.cxx
magras
Замени size_t на char и посмотри что выйдет: https://godbolt.org/z/GP78jv

@smertig об этом и говорит - если оперировать блоками по 64 бита это легко оптимизируется. Если блоки по 8 бит, нужно будет хвост обрабатывать отдельно, так как компилятор не справляется.
Да собственно и не важно, справится компилятор или нет. Важно что обработка этого хвоста не бесплатна.
источник

AT

Anatoly Tomilov in pro.cxx
magras
Замени size_t на char и посмотри что выйдет: https://godbolt.org/z/GP78jv

@smertig об этом и говорит - если оперировать блоками по 64 бита это легко оптимизируется. Если блоки по 8 бит, нужно будет хвост обрабатывать отдельно, так как компилятор не справляется.
там два прыжка вперёд получаются https://godbolt.org/z/oYsMex
источник

AT

Anatoly Tomilov in pro.cxx
больше нет оверхеда
источник

AT

Anatoly Tomilov in pro.cxx
не перестаю удивляться, до чего же умные компиляторы
источник

AT

Anatoly Tomilov in pro.cxx
ошибся — вот ещё круче оптимизация со стороны компилятора https://godbolt.org/z/edYaqc (upd: для 117 бит всё намного печальнее)
источник

m

magras in pro.cxx
Anatoly Tomilov
больше нет оверхеда
In my book два дополнительных цикла - это оверхед, который устраняется паддингом. Это увеличивает размер реально исполняемого кода, что например влияет на кеширование.

Согласен что такое решение может быть полезно. Но оно дороже в поддержке и дает спорное преимущество.
источник

AT

Anatoly Tomilov in pro.cxx
magras
In my book два дополнительных цикла - это оверхед, который устраняется паддингом. Это увеличивает размер реально исполняемого кода, что например влияет на кеширование.

Согласен что такое решение может быть полезно. Но оно дороже в поддержке и дает спорное преимущество.
там нет циклов
источник