?
Ни о какой безапелляционности в моих высказываниях не может быть и речи! [entries|archive|friends|userinfo]
Anatoly Vorobey

[ website | Website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Links
[Links:| English-language weblog ]

о выравнивании и процессорах (программистское) [янв. 2, 2014|02:17 pm]
Anatoly Vorobey
[Tags|]

ESR (Эрик Реймонд) написал подробное и ясное объяснение того, как в Си выравниваются структуры (alignment). Тем, кто не сталкивался с этим вопросом и не знает, интересно будет почитать.

Почему он при этом назвал свою статью "The Lost Art of C Structure Packing", мне непонятно. ESR почему-то считает, что в наше время все разучились это делать, или просто новые программисты на Си не знают об этом, а помнят одни "старички". Я не вижу оснований так считать. Как мне это помнится - что 20 лет назад, что сейчас: начинающие или малоопытные программисты на Си/С++ не знают про alignment, а опытные знают и по привычке правильно расставляют поля внутри структуры.

Еще есть один простой трюк, который ESR забыл упомянуть: развернуть структуру. Скажем, если у вас есть структура, в которой только указатель и символ, и вы работаете с огромными массивами таких структур, то можно вместо этого держать два отдельных массива, указателей и символов, и работать с ними вместе. Вы платите за этой сложностью кода, и возможно небольшим снижением скорости (за счет локальности кэша CPU), но то, что памяти нужно теперь почти в 2 раза меньше, вполне может перевесить эти недостатки. С другой стороны, конечно, зачастую это будет преждевременная и ненужная оптимизация.

Из дискуссии на Hacker News по поводу этой статьи я хочу процитировать одну мысль про процессоры Intel, которая мне понравилась, и как-то не приходила самому в голову:
Intel actually put in an feature to trap on unaligned access starting with the 486 (and it still exists today) - look up the AC "alignment check" flag. Of course almost no one used that feature since x86 supported unaligned access from the very beginning, and I think this flexibility is one of the reasons why it's stayed competitive: lots of features initially, not all of them optimal (e.g. division instruction on the 8088 was extremely slow), then improve on them with each new microarchitecture, the result being that existing software benefits from these improvements. In contrast, an architecture that didn't support unaligned access would not do much for existing software if faster instructions for unaligned access were introduced since they wouldn't be used.

Иными словами, когда речь идет о наборе возможностей микропроцессора, Интел предпочитал сделать "больше, но плохо", а не "меньше, но хорошо". Медленные инструкции или медленный доступ к невыровненной памяти можно улучшить в следующем процессоре, закон Мура нам поможет, и когда это случится, уже написанные программы сами по себе станут работать быстрее. А если начать с малого, а потом добавлять, то нужно будет еще ждать, пока новые компиляторы и программы напишут, которые используют эти добавки. Выглядит правдоподобно.
СсылкаОтветить

Comments:
Проблема на мой взгляд в том, что программное обеспечение обновляется сейчас чуть ли не быстрее процессоров. Конечно есть старые отточенные библиотеки, но какой процент программ их используют? А там, где нужно быстродействие - всё каждый раз переписывают под новые фичи. Каждая новая версия SSE - и весь старый мультимедийный код летит в помойку.
(Ответить) (Thread)
[User Picture]From: kray_zemli
2014-01-02 02:58 pm
Что-то курили? Ядро Windows претерпевает в основном косметические изменения. Всерьёз поменяли, пожалуй, только видеоподсистему.
(Ответить) (Parent) (Thread)
Пробежался поиском, но не нашёл, где в ветке шла речь о ядре Windows.
(Ответить) (Parent) (Thread)
[User Picture]From: kray_zemli
2014-01-02 03:29 pm
Это пример. Вся "классика" если и меняется изнутри, то это простым смертным неведомо: photoshop, office, и т.д. Ядро Linux туда же. Казалось бы, появление GPU должно всерьёз сменить конценпцию ядра ОС, но воз и ныне там. Есть отдельные экспериментаторы, использующие GPU для SSL и роутинга, но частью ОС это всё не станет ещё долго. Программки "одного дня" -- да, переписываются постоянно, но когда это было не так?
(Ответить) (Parent) (Thread)
[User Picture]From: nuladno
2014-01-02 01:02 pm
таки я однажды лет 10 назад "ахальти ота". Меняла малюсенький кусок в чужой и весьма обширной программе - и она начала лажать, причем в фичере, который совершенно и абсолютно не зависел от моих изменений! В конце концов установила, что лажа шла от одного поля в совершенно не моей и нетронутой мною структуре, которое, будучи инт32, торчало посередь полей инт16, и в новой версии оказалось на адресе, не делящемся на 4.
(Ответить) (Thread)
[User Picture]From: 3d_object
2014-01-02 02:58 pm
(глядя со стороны) - а нельзя ли как-то автоматизировать процесс поиска таких багов?
(Ответить) (Parent) (Thread)
From: A R
2014-01-02 03:20 pm

huh?

Просто никогда не использовать 'packed' структуры и нормальный компилятор все расставит на свои места - ну потребуется больше памяти в самом самом крайнем случае.

Использование 'packed' позвольяет обойтись без сериализации/де-сериализации не задумываясь о деталях но создает тонну головной боли при миграции с одной архитектуры на другую.



Edited at 2014-01-02 15:21 (UTC)
(Ответить) (Parent) (Thread)
[User Picture]From: nuladno
2014-01-02 05:13 pm

Re: huh?

ну на всяких ДСП памяти почему-то всегда в обрез.
(Ответить) (Parent) (Thread)
[User Picture]From: nuladno
2014-01-02 03:35 pm
да такое-то и дотошный компайлер поймать может, просто обычно народу влом читать 100500 ворнингов, если всё работает.
А потом меняешь че-нить маленькое - а компилируешь-то уже только поменянный файл!
Мораль: вредно отключать или еще как-нить игнорировать ворнинги. Они иногда умный вэщь говорят.
(Ответить) (Parent) (Thread)
From: A R
2014-01-02 04:23 pm

Huh?

Оказывается есть на свете места где компилируют без -Werror или его эквивалента.

Настоящие клубы самоубийц.


Edited at 2014-01-02 16:24 (UTC)
(Ответить) (Parent) (Thread)
[User Picture]From: nuladno
2014-01-02 04:35 pm

Re: Huh?

ну вот я получила допустим биб-ку от человека, который вручную оптимизировал так, что никакой оптимайзер не доплюнет (тем более что в оптимайзере баги). Но на ворнинги он плювал принципиально. Ну то есть как бы имел право - если он архитектуру знал лучше оптимайзера и отдавал себе отчет в том, что он делает.
(Ответить) (Parent) (Thread)
From: A R
2014-01-02 04:55 pm

Re: Huh?

1. Это не о программистах а о корпоративной политике.

2. Я не никогда не поверю что человек досконоально разбирающийся в архитестуре не знает как подавить false positive warnings.

3. И еще я не поверю что человек плюющий на warnings может разбираться в архитектурах. С другой стороны может это Российская специфика.


Edited at 2014-01-02 17:03 (UTC)
(Ответить) (Parent) (Thread)
[User Picture]From: nuladno
2014-01-02 05:15 pm

Re: Huh?

э... как Вы угадали? Я-то в Израиле, но автор биб-ки в России.
(Ответить) (Parent) (Thread)
From: huzhepidarasa
2014-01-03 05:28 pm

Re: Huh?

В архитектурах, может, и разбирается, а в процессе промышленного производства софта — нет. Просто хочется взять и уе Довольно часто встречаются такие узкие специалисты, приходится с ними работать, ашоделать.
(Ответить) (Parent) (Thread)
[User Picture]From: dmarck
2014-01-02 01:19 pm
cache thrashing, IPI, lock contention, и всё такое нынче гораздо больше головной боли создают, как мне кажется...
(Ответить) (Thread)
[User Picture]From: haiut
2014-01-02 01:25 pm
ESR почему-то считает, что в наше время все разучились это делать, или просто новые программисты на Си не знают об этом, а помнят одни "старички". Я не вижу оснований так считать

никто не говорит, что "новые" хуже или тупее "старичков".. но надо признать, что Си вытесняется из мэйнстрима (20-30 лет назад) на уровень инфраструктуры, которой занимаются все меньший процент людей в этой индустрии .. а эта самая инфраструктура уже так придумана/построена/отлажена, что воспринимается как данность, как вода в кране или электричество в розетке .. соответственно, все меньший и меньший процент программистов понимают, как оно "там" работает, и владеют техниками написания "там" .. типа того-же выравнивания структур ..
(Ответить) (Thread)
[User Picture]From: getman
2014-01-02 01:35 pm
Меньший процент не потому что все придумано и отлажено, а потому что уже существующая инфраструктура позволяет делать много гитик не задумываясь как все устроено внизу.
(Ответить) (Parent) (Thread)
[User Picture]From: spamsink
2014-01-02 03:29 pm
Именно так, и, увы, задумываться находится мало любителей. На лекции о новой архитектуре процессора, объединяющей достоинства DSP и general purpose CPUs, ходит от силы пара десятков человек.
(Ответить) (Parent) (Thread)
[User Picture]From: _winnie
2014-01-02 05:27 pm
Архитектура процессора меняется раз в несколько часов, от того что я пересаживаюсь на ноутбук, а затем выхожу из дома с телефоном.
(Ответить) (Parent) (Thread)
[User Picture]From: spamsink
2014-01-02 06:39 pm
Это неважно; задумываться, как устроена любая из них, и как ее можно было бы улучшить, находится мало желающих. В разработке процессоров нет легких денег, рекламу там запихнуть некуда.
(Ответить) (Parent) (Thread)
[User Picture]From: baramin
2014-01-02 07:38 pm
Да. Я тоже откусил от кактуса . Иногда не так страшно выравнивание, как то, что остается в щелях.
(Ответить) (Thread)
From: migmit
2014-01-02 09:19 pm
Ну, когда я работал в DrWeb, мы о выравнивании думали всегда. Просто потому, что иначе приходилось сутками не вылезать из дебаггера. А учитывая специфику того, что мы писали, отлаживался как правило уже крэшдамп.
(Ответить) (Thread)
[User Picture]From: mtyukanov
2014-01-02 09:55 pm
Я думаю, если что и поменялось, так как раз в сторону большего знания низкоуровневых подробностей C и C++. Лет 20 назад на C писали множество прикладухи просто потому, что это был мейнстрим, были библиотеки, было real programmers write in C. Ну и еще лет 10 после этого мейнстримом был C++. Но сейчас на них в основном пишут те, кому это действительно надо, и работа с бинарными структурами, часто железными, входит в число причин выбора именно C/C++. Т.е., не знают этого разве что совсем еще начинающие или те, кто вообще на них писать не хочет и не любит, но вот пришлось явщику/шарповику чуть повозиться с чужим кодом.
(Ответить) (Thread)
[User Picture]From: helvegr
2014-01-03 12:46 am
Ссылка на HN ведёт на обсуждение статьи про Сноудена.
(Ответить) (Thread)
[User Picture]From: avva
2014-01-03 01:06 am
Спасибо, сейчас исправлю.
(Ответить) (Parent) (Thread)
[User Picture]From: chaim_platonov
2014-01-03 11:23 am
Напомнило динамические языки на JVM.
(Ответить) (Thread)