Как в ассемблере извлечь N битов, начиная с какого-то индекс
От: Arsen.Shnurkov  
Дата: 18.03.17 09:02
Оценка:
Хочу пожать текст кодом хаффмана, а потом работать с разными символами, ссылаясь на них по номеру бита.

Поскольку это не арифметическое кодирование, то символы всегда будут располагаться на границах битов
и работать с ними будет легко и просто.

Какие команды есть в современных процессорах (x86_64) для реализации моей замечательной идеи?

И вообще, почему бы имея 64-битную шину не делать адресуемыми биты вместо байтов?
Отредактировано 18.03.2017 9:06 Arsen.Shnurkov . Предыдущая версия . Еще …
Отредактировано 18.03.2017 9:02 Arsen.Shnurkov . Предыдущая версия .
битовые поля
Re: Как в ассемблере извлечь N битов, начиная с какого-то индекс
От: Pzz Россия https://github.com/alexpevzner
Дата: 18.03.17 11:18
Оценка:
Здравствуйте, Arsen.Shnurkov, Вы писали:

AS>И вообще, почему бы имея 64-битную шину не делать адресуемыми биты вместо байтов?


Между прочим, более другие процессоры, даже имея 64-битную шину, не позволяют, к примеру, положить многобайтное целое, не выровняв его адрес соответствующим его размеру образом, и работать с ним арифметическими командами. x86 позволяет, но если вдуматься, это 1) обходится процессору в лишние такты и лишние транзисторы 2) замедляет программу, причем многие программисты этого не понимяют 3) имеет интересные последствия типа того, что атомарные операции с неправильно выровненным словом неожиданно и без предупреждения перестают быть атомарными 4) по большому счету, никакой особой пользы никому не приносит
Re[2]: Как в ассемблере извлечь N битов, начиная с какого-то
От: Arsen.Shnurkov  
Дата: 18.03.17 11:42
Оценка:
> 2)

и правильно не понимают. Потому что нет смет, расписывающих насколько становится хуже и за счёт чего. Может замедление приемлемо?

> 3) имеет интересные последствия типа того, что атомарные операции с неправильно выровненным словом неожиданно и без предупреждения перестают быть атомарными


не тот случай. Со строками всё равно атомарно не поработаешь, для этого нужен отдельный lock, который и так выравнен на границу чего-то там.

> 4)


лично мне принесёт радость, счастье и экономию памяти (за счёт несущественного снижения быстродействия)
Отредактировано 18.03.2017 11:45 Arsen.Shnurkov . Предыдущая версия . Еще …
Отредактировано 18.03.2017 11:43 Arsen.Shnurkov . Предыдущая версия .
Отредактировано 18.03.2017 11:42 Arsen.Shnurkov . Предыдущая версия .
Re[3]: Как в ассемблере извлечь N битов, начиная с какого-то
От: Pzz Россия https://github.com/alexpevzner
Дата: 18.03.17 12:04
Оценка:
Здравствуйте, Arsen.Shnurkov, Вы писали:

>> 2)


AS>и правильно не понимают. Потому что нет смет, расписывающих насколько становится хуже и за счёт чего. Может замедление приемлемо?


Может приемлимо, может не приемлимо. Проблема в том, что о замедлении, произошедшем из-за плохого выравнивания, никто не предупредит. Ни компилятор, ни операционная система, ни процессор.

Кстати, в мобильных устройствах "замедление" == "повышенный расход батарейки".

>> 3) имеет интересные последствия типа того, что атомарные операции с неправильно выровненным словом неожиданно и без предупреждения перестают быть атомарными


AS>не тот случай. Со строками всё равно атомарно не поработаешь, для этого нужен отдельный lock, который и так выравнен на границу чего-то там.


Тут проблема в том, что совершенно корректный на вид InterlockedIncrement() может оказаться на самом деле нифига не Interlocked, из-за того, что данные неправильно выровнены. Причем проявляться эта проблема будет далеко не всегда. Кто из нонешних программистов вообще в курсе о том, что между атомарностью и выравниванием существует связь?

>> 4)


AS>лично мне принесёт радость, счастье и экономию памяти (за счёт несущественного снижения быстродействия)


Ну на самом деле, нет. Потому что сначала индусы понапишут тормозного кода. А потом, когда тормоза станут невыносимыми, наймут других индусов, которые все ускорят, за счет агрессивного кеширования промежуточных результатов (потому что код, генерирующий эти результаты перейдет к тому времени в состояние "не тронь, вонять не будет", и его никто не решится оптимизировать).

Поэтому в результате будет и медленно, и прожорливо по памяти.
Re: Как в ассемблере извлечь N битов, начиная с какого-то индекс
От: kov_serg Россия  
Дата: 18.03.17 13:07
Оценка:
Здравствуйте, Arsen.Shnurkov, Вы писали:

AS>Хочу пожать текст кодом хаффмана, а потом работать с разными символами, ссылаясь на них по номеру бита.

Лучше BWT попробуй

AS>Поскольку это не арифметическое кодирование, то символы всегда будут располагаться на границах битов

AS>и работать с ними будет легко и просто.
Что мешает складывать данные блоками по равными машинному слову? И уже регистры двигать.

AS>Какие команды есть в современных процессорах (x86_64) для реализации моей замечательной идеи?

обычные битовые операции и сдвиги иногда умножение этого за глаза хватит

AS>И вообще, почему бы имея 64-битную шину не делать адресуемыми биты вместо байтов?

Обычно вообще кэш линиями оперируют а не битами.
Re[3]: Как в ассемблере извлечь N битов, начиная с какого-то
От: cures Россия cures.narod.ru
Дата: 18.03.17 14:40
Оценка:
Здравствуйте, Arsen.Shnurkov, Вы писали:

AS>и правильно не понимают. Потому что нет смет, расписывающих насколько становится хуже и за счёт чего. Может замедление приемлемо?


Сметы есть на всё, просто не многие ими интересуются.

AS>не тот случай. Со строками всё равно атомарно не поработаешь, для этого нужен отдельный lock, который и так выравнен на границу чего-то там.


Кому не тот, кому тот. PC — универсальный процессор, специализированные программируются на верилоге, а не на ассемблере.

AS>лично мне принесёт радость, счастье и экономию памяти (за счёт несущественного снижения быстродействия)


Тогда python, принесёт радость и счастье ("несущественное" снижение быстродействия будет компенсировано повышением требований к памяти).
Как Вы собрались память экономить, если и так разложили её побитово? Тут максимум — лишняя загрузка и сдвиг с маской, то самое несущественно снижение быстродействия. Хотите сахара — бросайте унылый ассемблер, он не для этого, а в плюсах есть нормальные битовые массивы, с побитовой же адресацией, всё как Вы хотите.
Re: Как в ассемблере извлечь N битов, начиная с какого-то индекс
От: Alexander G Украина  
Дата: 18.03.17 14:46
Оценка:
Здравствуйте, Arsen.Shnurkov, Вы писали:

AS>Какие команды есть в современных процессорах (x86_64) для реализации моей замечательной идеи?


BEXTR ?
Русский военный корабль идёт ко дну!
Re[2]: Как в ассемблере извлечь N битов, начиная с какого-то индекс
От: Arsen.Shnurkov  
Дата: 18.03.17 14:57
Оценка: :))
AG> BEXTR ?

Да! Украинские специалисты профессиональнее российских!
Re[3]: Как в ассемблере извлечь N битов, начиная с какого-то
От: Ops Россия  
Дата: 24.03.17 11:25
Оценка:
Здравствуйте, Arsen.Shnurkov, Вы писали:

AS>и правильно не понимают. Потому что нет смет, расписывающих насколько становится хуже и за счёт чего. Может замедление приемлемо?


Так если оно приемлемо, то в чем вообще твоя проблема?
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[2]: Как в ассемблере извлечь N битов, начиная с какого-то индекс
От: Arsen.Shnurkov  
Дата: 26.03.17 10:33
Оценка:
_>Лучше BWT попробуй

не буду. Там же написано — текст нужен от нескольких килобайт.
Где такие строковые константы в текстах программы встречаются?
Нигде.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.