Зал ассемблерного позора
На днях товарищ зашёл с довольно неожиданным вопросом:
Вопрос, действительно, оказался с подвохом.
Всегда можно ответить уклончиво: «зависит от реализации», что будет абсолютной правдой. Человечество придумало много моделей того, как должен работать вычислитель. Как минимум до сих пор есть архитектуры CISC (Complex Instruction Set Computer) и RISC (Reduced -//-).
Первая архитектура, CISC, предлагает тысячи разных команд от простого «ничего не делай» (NOP) за один такт до инструкций вроде вычисления синуса и косинуса (FSINCOS), которые выполняются сотню тактов. Одна инструкция в CISC может запросить данные из памяти, провести вычисления и положить данные обратно в память.
Архитектура CISC распространена в персональных компьютерах, это в каком-то смысле наследие, когда машинный код писали люди, а люди хотели упростить себе работу, делая больше за меньшее количество кода.
Вторая архитектура, RISC, предлагает иной подход: каждая инструкция делает что-то одно: или работает с памятью, или занимается вычислениями. Разнообразие инструкций меньше, но программы более многословные. Это могло быть минусом, но сейчас с машинными кодом работают в основном компиляторы, а не люди. (Более подробно о различиях CISC и RISC можно почитать в этом переводе.)
Очевидно, что сокращенные команды RISC едва ли смогут выполняться дольше, чем комплексные команды CISC. Но всё равно хочется цифр.
Как я уже говорил, самая простая инструкция, которая есть — это NOP, буквально отсутствие действия. Эта инструкция выполняется один такт, то есть при частоте современного процессора 5 ГГц один такт занимает примерно 0.2 наносекунды.
Вот тут есть Зал ассемблерного позора, в котором автор составил список самого долго выполнения одной инструкции процессором. Первое место заняла инструкция fxrstor64 — чтение памяти устройства на шине PCIe.
Секрет медлительности довольно прост: другие ядра процессора генерируют множество неэффективных обращений и «забивают» очередь. «Замеряемая» инструкция становится в самый конец очереди и вынуждена ждать. В худшем случае получилось, что одна инструкция выполнялась 198 миллиардов тактов, то есть 62 секунды человеческого времени.
Очень специфичная информация. Но этот эксперимент показывает узкие места в архитектуре компьютера, а это может быть полезно для тех, кто готов бороться за каждую микросекунду ускорения своей программы.
На днях товарищ зашёл с довольно неожиданным вопросом:
Как ты думаешь, какой правильный ответ на вопрос «максимальное время исполнения одной инструкции в современном процессоре»?
Вопрос, действительно, оказался с подвохом.
Всегда можно ответить уклончиво: «зависит от реализации», что будет абсолютной правдой. Человечество придумало много моделей того, как должен работать вычислитель. Как минимум до сих пор есть архитектуры CISC (Complex Instruction Set Computer) и RISC (Reduced -//-).
Первая архитектура, CISC, предлагает тысячи разных команд от простого «ничего не делай» (NOP) за один такт до инструкций вроде вычисления синуса и косинуса (FSINCOS), которые выполняются сотню тактов. Одна инструкция в CISC может запросить данные из памяти, провести вычисления и положить данные обратно в память.
Архитектура CISC распространена в персональных компьютерах, это в каком-то смысле наследие, когда машинный код писали люди, а люди хотели упростить себе работу, делая больше за меньшее количество кода.
Вторая архитектура, RISC, предлагает иной подход: каждая инструкция делает что-то одно: или работает с памятью, или занимается вычислениями. Разнообразие инструкций меньше, но программы более многословные. Это могло быть минусом, но сейчас с машинными кодом работают в основном компиляторы, а не люди. (Более подробно о различиях CISC и RISC можно почитать в этом переводе.)
Очевидно, что сокращенные команды RISC едва ли смогут выполняться дольше, чем комплексные команды CISC. Но всё равно хочется цифр.
Как я уже говорил, самая простая инструкция, которая есть — это NOP, буквально отсутствие действия. Эта инструкция выполняется один такт, то есть при частоте современного процессора 5 ГГц один такт занимает примерно 0.2 наносекунды.
Вот тут есть Зал ассемблерного позора, в котором автор составил список самого долго выполнения одной инструкции процессором. Первое место заняла инструкция fxrstor64 — чтение памяти устройства на шине PCIe.
Секрет медлительности довольно прост: другие ядра процессора генерируют множество неэффективных обращений и «забивают» очередь. «Замеряемая» инструкция становится в самый конец очереди и вынуждена ждать. В худшем случае получилось, что одна инструкция выполнялась 198 миллиардов тактов, то есть 62 секунды человеческого времени.
Очень специфичная информация. Но этот эксперимент показывает узкие места в архитектуре компьютера, а это может быть полезно для тех, кто готов бороться за каждую микросекунду ускорения своей программы.