Size: a a a

Rust — русскоговорящее сообществo

2020 November 18

А

Алексей in Rust — русскоговорящее сообществo
Doge Shibu
Вопрос в том, что если процессор не найдет значение нужного участка памяти в кэше, то ему придется явно сходить до памяти, а это дико дорого.
А так и делается постоянно. Просто для производительности надо как раз минимизировать ситуации того что в кеше нет чего-то нужного.
источник

DS

Doge Shibu in Rust — русскоговорящее сообществo
Алексей
А так и делается постоянно. Просто для производительности надо как раз минимизировать ситуации того что в кеше нет чего-то нужного.
Да, но это делается заранее, до выполнения той инструкции, где эта память действительно понадобится.
источник

DS

Doge Shibu in Rust — русскоговорящее сообществo
Конвееры, спекулятивное исполнение, все дела.
источник

A

Aragaer in Rust — русскоговорящее сообществo
программа никуда сама не обращается
источник

А

Алексей in Rust — русскоговорящее сообществo
Cooler3D
Соответственно, программа в принципе не знает, где именно сохранены ее оперативные данные, и обращается за ними всегда к процессору, а уже он адресует к конечному местоположению, зная точно в кеше оно, или в ОЗУ?
Программа вообще оперирует только ОЗУ адресами и про кэш вообще не знает ничего.
источник

A

Aragaer in Rust — русскоговорящее сообществo
в программе говорится о том, что надо взять и что-то сотворить с некоторым адресом. Этот адрес всегда живет в памяти, но может быть продублирован в кеше
источник

А

Алексей in Rust — русскоговорящее сообществo
А процессор там сам разберётся.
источник

C

Cooler3D in Rust — русскоговорящее сообществo
Понял, спасибо.
источник

А

Алексей in Rust — русскоговорящее сообществo
Причём там же несколько уровней кешей и у каждого ядра ещё свой кэш.
источник

A

Aragaer in Rust — русскоговорящее сообществo
ну можно рассматривать каждый уровень кеша отдельно сам по себе
источник

А

Алексей in Rust — русскоговорящее сообществo
Doge Shibu
Конвееры, спекулятивное исполнение, все дела.
да, но это уже совсем глубокие детали
источник

DS

Doge Shibu in Rust — русскоговорящее сообществo
Алексей
да, но это уже совсем глубокие детали
Это как раз важные детали для понимания вопросов производительности, связанных с работой кэша.

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

А

Алексей in Rust — русскоговорящее сообществo
Также как и данных в ОЗУ по указанному адресу может не быть, потому что ОС выгрузила их на диск.
источник

A

Aragaer in Rust — русскоговорящее сообществo
при этом есть общее правило - если твой код простой и прямолинейный, то скорее всего компилятор сможет его соптимизировать с учетом особенностей процессора
источник

A

Aragaer in Rust — русскоговорящее сообществo
если же пытаться быть умным, можно напороться на то, что компилятор вас не поймет
источник

А

Алексей in Rust — русскоговорящее сообществo
Aragaer
при этом есть общее правило - если твой код простой и прямолинейный, то скорее всего компилятор сможет его соптимизировать с учетом особенностей процессора
Да, и стараться соблюдать локальность, то есть если данные используются вместе, то надо их поближе хранить и обрабатывать их по возможности в один заход.
источник

DS

Doge Shibu in Rust — русскоговорящее сообществo
Aragaer
при этом есть общее правило - если твой код простой и прямолинейный, то скорее всего компилятор сможет его соптимизировать с учетом особенностей процессора
Тут проблема обычно даже не у компилятора, а непосредственно у спекулятивного исполнения и предсказаний переходов у процессора.
источник

A

Aragaer in Rust — русскоговорящее сообществo
я видел случай, когда компилятор смог код вида
if (condition)
   thing = 5;
else
   thing = 1;

сделал битовыми операциями без условных переходов. Примерно так: thing = (condition << 2) | 1;
источник

RP

Roman Proskuryakov in Rust — русскоговорящее сообществo
Aragaer
я видел случай, когда компилятор смог код вида
if (condition)
   thing = 5;
else
   thing = 1;

сделал битовыми операциями без условных переходов. Примерно так: thing = (condition << 2) | 1;
источник

V

Vladyslav Batyrenko in Rust — русскоговорящее сообществo
Имею странную проблему, пытаясь скомпилировать вот этот крейт у себя локально на винде: https://github.com/storyscript/tracing-wasm

= note: rust-lld: error: unknown argument: -fuse-ld=lld-link
источник