Size: a a a

Compiler Development

2020 April 28

МБ

Михаил Бахтерев in Compiler Development
Но это было 3 года назад.
источник

MO

Mar Ort in Compiler Development
Михаил Бахтерев
Но в широкой команде всё-равно же стоит код этого nop-а, который занимает свой слот.

Про компилятор не знаю. Но когда смотрел на выставке примеры, nop-ов было много. И в исходниках очень много ручной оптимизации через intrinsic-и.
Несколько бит, которые бы все равно съело выравнивание
источник

МБ

Михаил Бахтерев in Compiler Development
Mar Ort
Несколько бит, которые бы все равно съело выравнивание
Можно ли раскрыть идею? Несколько - это сколько? Несколько на каждый nop или несколько на все nop-ы в слове? Типа, в инструкции есть префикс, который говорит, где nop-ы, а где нет?
источник

MO

Mar Ort in Compiler Development
Михаил Бахтерев
Можно ли раскрыть идею? Несколько - это сколько? Несколько на каждый nop или несколько на все nop-ы в слове? Типа, в инструкции есть префикс, который говорит, где nop-ы, а где нет?
Да, примерно так. Широкая команда состоит из слов по 4 байта. Первое слово - заголовок (префикс) ШК. Там, кроме всего прочего, 3 бита отведено на нопы
источник

МБ

Михаил Бахтерев in Compiler Development
Mar Ort
Да, примерно так. Широкая команда состоит из слов по 4 байта. Первое слово - заголовок (префикс) ШК. Там, кроме всего прочего, 3 бита отведено на нопы
Здорово. Спасибо за пояснения. Поди в этих префиксах и префетчи какие-нибудь закодированы?
источник

MO

Mar Ort in Compiler Development
Михаил Бахтерев
Здорово. Спасибо за пояснения. Поди в этих префиксах и префетчи какие-нибудь закодированы?
Я сейчас уже точно не вспомню, но там основную часть занимает "карта" ШК (какие типы слогов присутсвуют), индикаторы специальных режимов исполнения и, возможно, что-то еще.
Префетчи там кодируются в специальных слогах и через специальные регистры
источник

TS

Timur Safin in Compiler Development
Михаил Бахтерев
Здорово. Спасибо за пояснения. Поди в этих префиксах и префетчи какие-нибудь закодированы?
ну, таки, декодер фронта начнет пропускать эти нопы в бандле, только после того как подсосется подложка в кеш.

То есть чтобы эффективно пропустить неиспользуемые байты инструкции - надо их прокачать через подсистему памяти.
источник

МБ

Михаил Бахтерев in Compiler Development
Timur Safin
ну, таки, декодер фронта начнет пропускать эти нопы в бандле, только после того как подсосется подложка в кеш.

То есть чтобы эффективно пропустить неиспользуемые байты инструкции - надо их прокачать через подсистему памяти.
Ну, если есть префикс, который описывает пропуски, то это, вроде как, немного смягчает ситуацию по объёму кода.
источник

МБ

Михаил Бахтерев in Compiler Development
Но вообще, да. Люди часто забывают, что число инструкций - это важно. Фигачат на Крестах кучи инлайнов и получают трэшинг кэшей, а потом удивляются, почему APL быстрее работает :)
источник

TS

Timur Safin in Compiler Development
не смягчает - вы все равно кратно проигрываете эффективности работы с памятью x86. За счет более плотных инструкций у второго
источник

МБ

Михаил Бахтерев in Compiler Development
Timur Safin
не смягчает - вы все равно кратно проигрываете эффективности работы с памятью x86. За счет более плотных инструкций у второго
x86 выигрывает совсем не за счёт плотности инструкций, imho, а за счёт охренно длинных in-flight буферов, предсказателей, wb-очередей и т.д. и т.п. Если бы плотность имела значение, писали бы мы всё для стековых процессоров.
источник

MO

Mar Ort in Compiler Development
Timur Safin
не смягчает - вы все равно кратно проигрываете эффективности работы с памятью x86. За счет более плотных инструкций у второго
Тут вопрос наверное в том, насколько это в реальной жизни проблема. Если префетч инструкций успевает за исполнением, то по большому счету не важно
источник

TS

Timur Safin in Compiler Development
IIRC, в свое время, в Бабаяновском процессоре VIP (это который был в Интеле, но как развитие многих идей VLIW, и Elbrus) подсчитали плотность очень широких инструкций на линию кеша (скажем 32байт):  и у VIP было 2,5, а у x86 - 15. 🤷‍♂️
источник

МБ

Михаил Бахтерев in Compiler Development
Но, конечно, у x86 код плотнее. Но вот POWER-ы тоже очень быстрые, а там пожиже.
источник

MO

Mar Ort in Compiler Development
И, в случае суперскаляра, интересно, сколько места занимают уже скомпилированные в микрокод инструкции и как там с кешем дела
источник

МБ

Михаил Бахтерев in Compiler Development
Mar Ort
И, в случае суперскаляра, интересно, сколько места занимают уже скомпилированные в микрокод инструкции и как там с кешем дела
У суперскаляров это внутренние кэши и очереди. То есть, ещё один уровень, выше L1.
источник

MO

Mar Ort in Compiler Development
Михаил Бахтерев
У суперскаляров это внутренние кэши и очереди. То есть, ещё один уровень, выше L1.
Я понимаю
источник

TS

Timur Safin in Compiler Development
Mar Ort
Тут вопрос наверное в том, насколько это в реальной жизни проблема. Если префетч инструкций успевает за исполнением, то по большому счету не важно
не важно, было бы, если проигрыш по эффективности работы с памятью был бы не больше 2-раз. А так с горем пополам напихали в бандл 4 инордер инструкции (и это в идеальном случае, идеального компилятора), а за это время x86 вычитал в 8 раз больше апустил на исполнение инструкций, с тактом больше 2х. И опп...
источник

TS

Timur Safin in Compiler Development
(а на практике окажется, что под Linux-ом с Итаником, использовался gcc у которого было по 1-ой инструкции на бандл. И производительность по сравнению с тем же самым кодом на x86/Windows была просто неприличная. Потому и утонул)
источник

MO

Mar Ort in Compiler Development
Timur Safin
не важно, было бы, если проигрыш по эффективности работы с памятью был бы не больше 2-раз. А так с горем пополам напихали в бандл 4 инордер инструкции (и это в идеальном случае, идеального компилятора), а за это время x86 вычитал в 8 раз больше апустил на исполнение инструкций, с тактом больше 2х. И опп...
Возможно это и есть причина низкой тактовой частоты вливов, что декодер не успевает за памятью, поэтому вынуждены искуственно ее ограничивать? 🤔
источник