Size: a a a

2019 November 27

TK

Tigran Kostandyan in rannts
Roman Bolkhovitin
А ты чем до питона занимался, что ассемблерными инструкциями и процессорными регистрами думать умеешь? 😳😳😳
Или ты тоже робот, как Серега? )
Ну это довольно базовые вещи))
источник

TK

Tigran Kostandyan in rannts
В универе учат, да
источник

TK

Tigran Kostandyan in rannts
Так себе, но учат
источник

RB

Roman Bolkhovitin in rannts
Ну учат да, лабы сделал и забыл 😂😂
источник

ИК

Иван Кривошеев in rannts
Байт Словович
гипотетически..
прошивка считает отработанные секунды. ПОтом где то в коде переводит секунды в часы. Для этого делит секунды на 3600.
В процессорах есть операция целочисленного деления int32 / int16. Результат записывается в два 16битных регистра: один для частного, другой для остатка. Вот частное и не влезло.
64битный RAX
источник

БС

Байт Словович in rannts
Roman Bolkhovitin
А ты чем до питона занимался, что ассемблерными инструкциями и процессорными регистрами думать умеешь? 😳😳😳
Или ты тоже робот, как Серега? )
тебе весь мой жизненный путь? Ну я ребенком писал на ассемблере на ZX spectrum. Ваще я много писал на асме, пока не появились пентиумы с их хитрыми предсказаниями переходов, конвеерами и одновременным выполнением инстукций.
Запомнился эпизод из жизни. Писал на асме перемножение больших матриц (на тот момент 500x500  считались большими). Сделал прям оптимально оптимально. Учитывал и размер L1 кеша процессора, использовал MME и все такое. Был очень горд. Потом написал перемножение матриц влоб на С++ и скомпилировал интеловским компилятором. В общем, интел сделал мой идеальный код (который я писал пару недель) раза в полтора. А потом я взял MKL (math kernel library которую писали в нижегородском интеле) и она перемножила матрицы еще раза в два быстрее.
В общем после этого я только на плюсах и писал и так изредко посматривал что там он нагенерил.
источник

RB

Roman Bolkhovitin in rannts
Ну вот так понятно, а то "в универе учат" 😊😊
источник

БС

Байт Словович in rannts
в универе меня только думать учили и сдавать философию. Апрограммированию в универах не учат..
источник

TK

Tigran Kostandyan in rannts
Байт Словович
тебе весь мой жизненный путь? Ну я ребенком писал на ассемблере на ZX spectrum. Ваще я много писал на асме, пока не появились пентиумы с их хитрыми предсказаниями переходов, конвеерами и одновременным выполнением инстукций.
Запомнился эпизод из жизни. Писал на асме перемножение больших матриц (на тот момент 500x500  считались большими). Сделал прям оптимально оптимально. Учитывал и размер L1 кеша процессора, использовал MME и все такое. Был очень горд. Потом написал перемножение матриц влоб на С++ и скомпилировал интеловским компилятором. В общем, интел сделал мой идеальный код (который я писал пару недель) раза в полтора. А потом я взял MKL (math kernel library которую писали в нижегородском интеле) и она перемножила матрицы еще раза в два быстрее.
В общем после этого я только на плюсах и писал и так изредко посматривал что там он нагенерил.
Кстати, посоветуй где про конвейер почитать? У меня довольно плохое понимание его работы во время всяких конфликтов
источник

TK

Tigran Kostandyan in rannts
У нас чет препод один пример расписал, максимально элементарный, а на контрольной совсем другое было))
источник

БС

Байт Словович in rannts
Питонистам такие знания не нужны обычно 😊
источник

TK

Tigran Kostandyan in rannts
Байт Словович
Питонистам такие знания не нужны обычно 😊
Нормас троллинг
источник

БС

Байт Словович in rannts
в свое время, интел datasheet выпускал для процессоров. Там были устройства процессора, тайминги (сколько тактов выполняется команда и при каких условиях). Ну и про конвеер.
Но он был простой на первых пентиумах. А вот начиная с третьего пня, уже разобраться было сложно. Эти даташиты уже стали огромными.
источник

TK

Tigran Kostandyan in rannts
Ну я вообще не понимаю даже на примере чего мы разбирает, какая-то абстрактная архитектура
источник

n

nikiladonya in rannts
Да мы же в эпоху технологической сингулярности живем. Меня, помню, очень поразило утверждение в своё время, что нет ни одного человека, кто бы полностью понимал всё, что касается современного проца, от этапа производства до исполнения. Новое средневековье, законы Кларка, все дела)
источник

RB

Roman Bolkhovitin in rannts
Байт Словович
Питонистам такие знания не нужны обычно 😊
источник

RB

Roman Bolkhovitin in rannts
Жаль только, что автор гифки не осилил орфографию
источник

TK

Tigran Kostandyan in rannts
Вообще близко к истине
источник

AM

Artem Malyshev in rannts
Roman Bolkhovitin
Жаль только, что автор гифки не осилил орфографию
Шрифт не влез бы...
источник

БС

Байт Словович in rannts
ну могу попробовать на пальцах.
В процессоре есть много блоков. Например ALU. Этот блок занимается арифметикой.

Сам блок состаит из всяких подблоков. Например сумматоров. Сумматоров много, но они не 64битные, а например 16битные (утрирую для примера).
Чтобы сложить EAX + EDX нужно 4 такта для одного сумматора.

А можно взять 4  16 битных сумматора и сложить за один так (там есть хитрость с переносом, но пока не будем про неё).
Из за того что процессоры сейчас огромные (по числу транзисторов) и очень быстрые, то ограничение скорости света сказывается уже на сантиметровых размерах процессора. Как следствие, загрузить битики в сумматор из регистра (даже не из кеша, а из регистра) может потребовать такт, а то и больше.
В результате просто сложить два регистра может потребовать 1 такт на загрузку в сумматор, два такта на работу четырех сумматоров, такт на закгрузку результата в регистр. Итого 4.
Но если нам нужно сложить много регистров, то в среднем на сложение потребуется один такт (так как предварительные работы будут делаться параллельно).
Также, разные регистры могут быть сложены  параллельно.
например:
ADD AX, BX
ADD CX, DX  

можно выполнить параллельно. Так как есть свободные сумматоры и блоки по загрузки данных в сумматоры.
А вот
ADD AX, BX
ADD AX, CX

уже нельзя сделать паралельно, так как чтобы выполнить вторую операцию, надо точно знать результат первой. ПРоцессор в этом случае получает пенальти и простаивает..
А иногда получается, что нет сумматоров в наличии, они чем то другим заняты и операция увеличивается на два / три такта и суммирование далется одним.
В X86 семействе есть команды которые требуют сразу многих сложений для одной операции, например:
ADD EDX[SX], 88  # это операция увеличивает значение в памяти, при этом сначала выполняет сложение EDX + SX чтобы вычислить нужный адрес. Кажется, это называется индексная арифметика.


В резльутате получается, что переставив пару команд местами, производительность может вырости в разы, так как они будут лучше параллелиться. Не забываем что кроме регистров, есть еще разные флаги у процессора и там тоже есть свои конфликты.

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