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

Может ли процессор использовать аналогичную технику для недавних вычислений? Другими словами, способен ли процессор увидеть, рассчитывал ли он аналогичные вычисления раньше, и просто прибегнуть к кешированному результату?

2 ответа2

1

Кэш процессора мыслит более детально, чем "вычисления"; так же, как вы написали, он имеет дело с адресами, которые они содержат. Однако сами программы / приложения могут управлять таким типом кэша. Например, определенные пользователем функции серверов баз данных могут иметь свойство кэширования, потому что UDF обычно означают величину рабочей нагрузки, которую стоит избегать путем сохранения и извлечения предыдущих результатов.

0

На современном процессоре x86/x64 имеется три кэша: L1, L2 и L3.

Кэш L1 разделен между кешем инструкций и кешем данных. Между ними существует корреляция, поэтому инструкция в позиции x в кэше команд соответствует результату в позиции x кэша данных. Так что да, процессор может передавать результат вычисления из кеша, если инструкция действительно такая же, но не если она просто похожа. Другими словами, 2+5 - это не то же самое, что 3+4, даже если результат идентичен.

Кэш-память второго уровня - это только данные, и ее можно рассматривать как сверхбыструю оперативную память.

L3 - это то же самое, что и L2, за исключением того, что он используется всеми ядрами процессора (каждое ядро имеет свои собственные кэши L1 и L2).


Вот некоторые другие методы оптимизации, которые также относятся к вашему вопросу.

Предварительная выборка инструкций: ЦП может читать вперед в конвейере и выполнять инструкции до того, как они действительно будут запрошены. Результаты кэшируются, так что процессор может просто передавать результаты из кэша, когда инструкция наконец прибывает.

Предсказание ветвлений: Когда средство предварительной выборки видит, что появляется команда условного перехода (оператор If/Then в вашем коде), он может решить, какую ветвь с большей вероятностью взять (или, если возможно, выполнить обе ветви параллельно) и выполнить предварительный расчет. результаты, достижения. Если он угадал правильно (или если он выполнялся одновременно), то результат просто подается из кеша.

Внеочередное выполнение. Декодер команд может переставить инструкции в модуле предварительной выборки так, чтобы они выполнялись в порядке, наиболее эффективном для ЦП. Результаты хранятся прямо в кеше, поэтому их можно выводить в правильном порядке, ожидаемом программой.

Инструкции SIMD (одна инструкция, несколько данных): ЦП может выполнять одинаковые вычисления для нескольких точек данных с помощью одной инструкции. Например, добавление 5 к каждому из массива целых чисел. Процессор может выполнять инструкцию повторно без необходимости декодировать инструкцию ADD для каждого вычисления.


Есть МНОГО оптимизаций , что современные процессорам сделать , чтобы улучшить производительность, но и не сбрасывать со счетов влияния оптимизирующих компиляторов. Хороший компилятор знает сильные и слабые стороны архитектуры ЦП и может оптимизировать код еще до того, как он достигнет ЦП. Например, компилятор может знать, что в программе никогда не изменяются два конкретных значения, поэтому ЦПУ может вычислять их во время компиляции и вставлять их прямо в код, а не заставлять ЦП выполнять работу во время выполнения. Он также может знать, что конкретный процессор быстрее читает, чем прыгает, поэтому он может жестко кодировать одно и то же значение данных 5 раз, вместо того, чтобы ЦП делал 5 прыжков.

Вот хороший ресурс о том, как работают кеши памяти.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .