Здравствуйте, Arsen.Shnurkov, Вы писали:
AS>И вообще, почему бы имея 64-битную шину не делать адресуемыми биты вместо байтов?
Между прочим, более другие процессоры, даже имея 64-битную шину, не позволяют, к примеру, положить многобайтное целое, не выровняв его адрес соответствующим его размеру образом, и работать с ним арифметическими командами. x86 позволяет, но если вдуматься, это 1) обходится процессору в лишние такты и лишние транзисторы 2) замедляет программу, причем многие программисты этого не понимяют 3) имеет интересные последствия типа того, что атомарные операции с неправильно выровненным словом неожиданно и без предупреждения перестают быть атомарными 4) по большому счету, никакой особой пользы никому не приносит
Re[2]: Как в ассемблере извлечь N битов, начиная с какого-то
и правильно не понимают. Потому что нет смет, расписывающих насколько становится хуже и за счёт чего. Может замедление приемлемо?
> 3) имеет интересные последствия типа того, что атомарные операции с неправильно выровненным словом неожиданно и без предупреждения перестают быть атомарными
не тот случай. Со строками всё равно атомарно не поработаешь, для этого нужен отдельный lock, который и так выравнен на границу чего-то там.
> 4)
лично мне принесёт радость, счастье и экономию памяти (за счёт несущественного снижения быстродействия)
Здравствуйте, Arsen.Shnurkov, Вы писали:
>> 2)
AS>и правильно не понимают. Потому что нет смет, расписывающих насколько становится хуже и за счёт чего. Может замедление приемлемо?
Может приемлимо, может не приемлимо. Проблема в том, что о замедлении, произошедшем из-за плохого выравнивания, никто не предупредит. Ни компилятор, ни операционная система, ни процессор.
Кстати, в мобильных устройствах "замедление" == "повышенный расход батарейки".
>> 3) имеет интересные последствия типа того, что атомарные операции с неправильно выровненным словом неожиданно и без предупреждения перестают быть атомарными
AS>не тот случай. Со строками всё равно атомарно не поработаешь, для этого нужен отдельный lock, который и так выравнен на границу чего-то там.
Тут проблема в том, что совершенно корректный на вид InterlockedIncrement() может оказаться на самом деле нифига не Interlocked, из-за того, что данные неправильно выровнены. Причем проявляться эта проблема будет далеко не всегда. Кто из нонешних программистов вообще в курсе о том, что между атомарностью и выравниванием существует связь?
>> 4)
AS>лично мне принесёт радость, счастье и экономию памяти (за счёт несущественного снижения быстродействия)
Ну на самом деле, нет. Потому что сначала индусы понапишут тормозного кода. А потом, когда тормоза станут невыносимыми, наймут других индусов, которые все ускорят, за счет агрессивного кеширования промежуточных результатов (потому что код, генерирующий эти результаты перейдет к тому времени в состояние "не тронь, вонять не будет", и его никто не решится оптимизировать).
Поэтому в результате будет и медленно, и прожорливо по памяти.
Re: Как в ассемблере извлечь N битов, начиная с какого-то индекс
Здравствуйте, Arsen.Shnurkov, Вы писали:
AS>Хочу пожать текст кодом хаффмана, а потом работать с разными символами, ссылаясь на них по номеру бита.
Лучше BWT попробуй
AS>Поскольку это не арифметическое кодирование, то символы всегда будут располагаться на границах битов AS>и работать с ними будет легко и просто.
Что мешает складывать данные блоками по равными машинному слову? И уже регистры двигать.
AS>Какие команды есть в современных процессорах (x86_64) для реализации моей замечательной идеи?
обычные битовые операции и сдвиги иногда умножение этого за глаза хватит
AS>И вообще, почему бы имея 64-битную шину не делать адресуемыми биты вместо байтов?
Обычно вообще кэш линиями оперируют а не битами.
Re[3]: Как в ассемблере извлечь N битов, начиная с какого-то
Здравствуйте, Arsen.Shnurkov, Вы писали:
AS>и правильно не понимают. Потому что нет смет, расписывающих насколько становится хуже и за счёт чего. Может замедление приемлемо?
Сметы есть на всё, просто не многие ими интересуются.
AS>не тот случай. Со строками всё равно атомарно не поработаешь, для этого нужен отдельный lock, который и так выравнен на границу чего-то там.
Кому не тот, кому тот. PC — универсальный процессор, специализированные программируются на верилоге, а не на ассемблере.
AS>лично мне принесёт радость, счастье и экономию памяти (за счёт несущественного снижения быстродействия)
Тогда python, принесёт радость и счастье ("несущественное" снижение быстродействия будет компенсировано повышением требований к памяти).
Как Вы собрались память экономить, если и так разложили её побитово? Тут максимум — лишняя загрузка и сдвиг с маской, то самое несущественно снижение быстродействия. Хотите сахара — бросайте унылый ассемблер, он не для этого, а в плюсах есть нормальные битовые массивы, с побитовой же адресацией, всё как Вы хотите.
Re: Как в ассемблере извлечь N битов, начиная с какого-то индекс
Здравствуйте, Arsen.Shnurkov, Вы писали:
AS>и правильно не понимают. Потому что нет смет, расписывающих насколько становится хуже и за счёт чего. Может замедление приемлемо?
Так если оно приемлемо, то в чем вообще твоя проблема?
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[2]: Как в ассемблере извлечь N битов, начиная с какого-то индекс