Сообщение Re[4]: Энергоэффективность алгоритмов от 19.02.2025 22:22
Изменено 20.02.2025 2:12 Философ
Re[4]: Энергоэффективность алгоритмов
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>Хочешь убрать кеш? Боюсь время отклика софта...
Не, совсем убирать кэш — лишее, можно не убирать кэш, да и невозможно это. Можно строить алгоритм так, чтобы он по-минимому инвалидировал кэш-линейки (даже ценой лишних вычислений).
Кроме того, далеко не всегда время отклика имеет значение: есть риалтаймовые операции, а есть операции, не требующие риалтайма. Например, показать, что кнопка нажалась, нужно сразу — риалтайм, а вот выдавать результат можно и не в риалтайме. Более того, сотни фоновых служб вообще не требуют внимания пользователя — там всё равно минуту CPU они сожрут или сто, результат пользователь наверняка увидит минимум завтра, а может, и вообще не увидит.
SVZ>К тому же всегда стремились уменьшить частоту обновления кеша. А для этого данные желательно укладывать плотно, чтобы минимизировать промахи.
Категорически неверно, наоборот: данные редко укладываются плотно — их выравнивают по границам DWORD и QWORD. Мотивация тут простая: современные процессоры работают с памятью блоками фиксированного размера, поэтому если данные выровнены по границам этих блоков, процессору требуется всего одно обращение к памяти для чтения или записи. Если данные не выровнены, процессору может потребоваться два или более обращения, что увеличивает накладные расходы. Кроме того, SIMD-инструкции (например, SSE, AVX) часто требуют, чтобы данные были выровнены по определенным границам (например, 16 байт для SSE, 32 байта для AVX).
Выравнивание данных уменьшает промахи кэша: кэш-память работает с блоками данных (кэш-линиями), обычно размером 64 байта. Выровненные данные с меньшей вероятностью пересекают границы кэш-линий, что уменьшает количество кэш-промахов и вероятность вытеснения данных из кэша. Однако если данные не выровнены, они могут пересекать границы кэш-линий, и процессору потребуется загрузить или обновить две кэш-линии вместо одной.
Например, если операция записывает элемент данных размером QWORD, и он не выровнен, то одна часть данных может оказаться в одной кэш-линии, а другая — в следующей. Это приведёт к тому, что процессору потребуется пометить две кэш-линии как DIRTY вместо одной, что увеличивает накладные расходы.
Кроме того, современные кэши используют ассоциативную организацию. Если данные не выровнены, они могут попадать в разные наборы кэша, что увеличивает вероятность кэш-конфликтов. Выравнивание данных помогает минимизировать такие конфликты.
Ф>>4)...поводу использования синхронизации...инструкций типа PAUSE....
SVZ>Что-то мне подсказывает, что ты говоришь о размазывании потребления во времени, а не сокращении оного. Ну т.е. число операций значимо не уменьшится, просто процессор будет больше спать. Но суммарно на решение времени потратит то же количество энергии, что и в "турбо" режиме.
Нет, например в случае инструкции PAUSE внутри цикла с высокой вероятностью произойдёт снижение частоты ядра и с меньшей вероятностью переход в более глубокий C-state. В связи с тем, что асимптотика тепловыделения на средних частотах кубическая, а на высоких экспоненциальная, то само по себе использование PAUSE имеет смысл — это не размазывание по времени. Размазыванием по времени это было бы, если бы была линейная зависимость.
SVZ>Хочешь убрать кеш? Боюсь время отклика софта...
Не, совсем убирать кэш — лишее, можно не убирать кэш, да и невозможно это. Можно строить алгоритм так, чтобы он по-минимому инвалидировал кэш-линейки (даже ценой лишних вычислений).
Кроме того, далеко не всегда время отклика имеет значение: есть риалтаймовые операции, а есть операции, не требующие риалтайма. Например, показать, что кнопка нажалась, нужно сразу — риалтайм, а вот выдавать результат можно и не в риалтайме. Более того, сотни фоновых служб вообще не требуют внимания пользователя — там всё равно минуту CPU они сожрут или сто, результат пользователь наверняка увидит минимум завтра, а может, и вообще не увидит.
SVZ>К тому же всегда стремились уменьшить частоту обновления кеша. А для этого данные желательно укладывать плотно, чтобы минимизировать промахи.
Категорически неверно, наоборот: данные редко укладываются плотно — их выравнивают по границам DWORD и QWORD. Мотивация тут простая: современные процессоры работают с памятью блоками фиксированного размера, поэтому если данные выровнены по границам этих блоков, процессору требуется всего одно обращение к памяти для чтения или записи. Если данные не выровнены, процессору может потребоваться два или более обращения, что увеличивает накладные расходы. Кроме того, SIMD-инструкции (например, SSE, AVX) часто требуют, чтобы данные были выровнены по определенным границам (например, 16 байт для SSE, 32 байта для AVX).
Выравнивание данных уменьшает промахи кэша: кэш-память работает с блоками данных (кэш-линиями), обычно размером 64 байта. Выровненные данные с меньшей вероятностью пересекают границы кэш-линий, что уменьшает количество кэш-промахов и вероятность вытеснения данных из кэша. Однако если данные не выровнены, они могут пересекать границы кэш-линий, и процессору потребуется загрузить или обновить две кэш-линии вместо одной.
Например, если операция записывает элемент данных размером QWORD, и он не выровнен, то одна часть данных может оказаться в одной кэш-линии, а другая — в следующей. Это приведёт к тому, что процессору потребуется пометить две кэш-линии как DIRTY вместо одной, что увеличивает накладные расходы.
Кроме того, современные кэши используют ассоциативную организацию. Если данные не выровнены, они могут попадать в разные наборы кэша, что увеличивает вероятность кэш-конфликтов. Выравнивание данных помогает минимизировать такие конфликты.
Ф>>4)...поводу использования синхронизации...инструкций типа PAUSE....
SVZ>Что-то мне подсказывает, что ты говоришь о размазывании потребления во времени, а не сокращении оного. Ну т.е. число операций значимо не уменьшится, просто процессор будет больше спать. Но суммарно на решение времени потратит то же количество энергии, что и в "турбо" режиме.
Нет, например в случае инструкции PAUSE внутри цикла с высокой вероятностью произойдёт снижение частоты ядра и с меньшей вероятностью переход в более глубокий C-state. В связи с тем, что асимптотика тепловыделения на средних частотах кубическая, а на высоких экспоненциальная, то само по себе использование PAUSE имеет смысл — это не размазывание по времени. Размазыванием по времени это было бы, если бы была линейная зависимость.
Re[4]: Энергоэффективность алгоритмов
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>Хочешь убрать кеш? Боюсь время отклика софта...
Не, совсем убирать кэш — лишее, можно не убирать кэш, да и невозможно это. Можно строить алгоритм так, чтобы он по-минимому затрагивал кэш-линейки (даже ценой лишних вычислений).
Кроме того, далеко не всегда время отклика имеет значение: есть риалтаймовые операции, а есть операции, не требующие риалтайма. Например, показать, что кнопка нажалась, нужно сразу — риалтайм, а вот выдавать результат можно и не в риалтайме. Более того, сотни фоновых служб вообще не требуют внимания пользователя — там всё равно минуту CPU они сожрут или сто, результат пользователь наверняка увидит минимум завтра, а может, и вообще не увидит.
SVZ>К тому же всегда стремились уменьшить частоту обновления кеша. А для этого данные желательно укладывать плотно, чтобы минимизировать промахи.
Категорически неверно, наоборот: данные редко укладываются плотно — их выравнивают по границам DWORD и QWORD. Мотивация тут простая: современные процессоры работают с памятью блоками фиксированного размера, поэтому если данные выровнены по границам этих блоков, процессору требуется всего одно обращение к памяти для чтения или записи. Если данные не выровнены, процессору может потребоваться два или более обращения, что увеличивает накладные расходы. Кроме того, SIMD-инструкции (например, SSE, AVX) часто требуют, чтобы данные были выровнены по определенным границам (например, 16 байт для SSE, 32 байта для AVX).
Выравнивание данных уменьшает промахи кэша: кэш-память работает с блоками данных (кэш-линиями), обычно размером 64 байта. Выровненные данные с меньшей вероятностью пересекают границы кэш-линий, что уменьшает количество кэш-промахов и вероятность вытеснения данных из кэша. Однако если данные не выровнены, они могут пересекать границы кэш-линий, и процессору потребуется загрузить или обновить две кэш-линии вместо одной.
Например, если операция записывает элемент данных размером QWORD, и он не выровнен, то одна часть данных может оказаться в одной кэш-линии, а другая — в следующей. Это приведёт к тому, что процессору потребуется пометить две кэш-линии как DIRTY вместо одной, что увеличивает накладные расходы.
Кроме того, современные кэши используют ассоциативную организацию. Если данные не выровнены, они могут попадать в разные наборы кэша, что увеличивает вероятность кэш-конфликтов. Выравнивание данных помогает минимизировать такие конфликты.
Ф>>4)...поводу использования синхронизации...инструкций типа PAUSE....
SVZ>Что-то мне подсказывает, что ты говоришь о размазывании потребления во времени, а не сокращении оного. Ну т.е. число операций значимо не уменьшится, просто процессор будет больше спать. Но суммарно на решение времени потратит то же количество энергии, что и в "турбо" режиме.
Нет, например в случае инструкции PAUSE внутри цикла с высокой вероятностью произойдёт снижение частоты ядра и с меньшей вероятностью переход в более глубокий C-state. В связи с тем, что асимптотика тепловыделения на средних частотах кубическая, а на высоких экспоненциальная, то само по себе использование PAUSE имеет смысл — это не размазывание по времени. Размазыванием по времени это было бы, если бы была линейная зависимость.
SVZ>Хочешь убрать кеш? Боюсь время отклика софта...
Не, совсем убирать кэш — лишее, можно не убирать кэш, да и невозможно это. Можно строить алгоритм так, чтобы он по-минимому затрагивал кэш-линейки (даже ценой лишних вычислений).
Кроме того, далеко не всегда время отклика имеет значение: есть риалтаймовые операции, а есть операции, не требующие риалтайма. Например, показать, что кнопка нажалась, нужно сразу — риалтайм, а вот выдавать результат можно и не в риалтайме. Более того, сотни фоновых служб вообще не требуют внимания пользователя — там всё равно минуту CPU они сожрут или сто, результат пользователь наверняка увидит минимум завтра, а может, и вообще не увидит.
SVZ>К тому же всегда стремились уменьшить частоту обновления кеша. А для этого данные желательно укладывать плотно, чтобы минимизировать промахи.
Категорически неверно, наоборот: данные редко укладываются плотно — их выравнивают по границам DWORD и QWORD. Мотивация тут простая: современные процессоры работают с памятью блоками фиксированного размера, поэтому если данные выровнены по границам этих блоков, процессору требуется всего одно обращение к памяти для чтения или записи. Если данные не выровнены, процессору может потребоваться два или более обращения, что увеличивает накладные расходы. Кроме того, SIMD-инструкции (например, SSE, AVX) часто требуют, чтобы данные были выровнены по определенным границам (например, 16 байт для SSE, 32 байта для AVX).
Выравнивание данных уменьшает промахи кэша: кэш-память работает с блоками данных (кэш-линиями), обычно размером 64 байта. Выровненные данные с меньшей вероятностью пересекают границы кэш-линий, что уменьшает количество кэш-промахов и вероятность вытеснения данных из кэша. Однако если данные не выровнены, они могут пересекать границы кэш-линий, и процессору потребуется загрузить или обновить две кэш-линии вместо одной.
Например, если операция записывает элемент данных размером QWORD, и он не выровнен, то одна часть данных может оказаться в одной кэш-линии, а другая — в следующей. Это приведёт к тому, что процессору потребуется пометить две кэш-линии как DIRTY вместо одной, что увеличивает накладные расходы.
Кроме того, современные кэши используют ассоциативную организацию. Если данные не выровнены, они могут попадать в разные наборы кэша, что увеличивает вероятность кэш-конфликтов. Выравнивание данных помогает минимизировать такие конфликты.
Ф>>4)...поводу использования синхронизации...инструкций типа PAUSE....
SVZ>Что-то мне подсказывает, что ты говоришь о размазывании потребления во времени, а не сокращении оного. Ну т.е. число операций значимо не уменьшится, просто процессор будет больше спать. Но суммарно на решение времени потратит то же количество энергии, что и в "турбо" режиме.
Нет, например в случае инструкции PAUSE внутри цикла с высокой вероятностью произойдёт снижение частоты ядра и с меньшей вероятностью переход в более глубокий C-state. В связи с тем, что асимптотика тепловыделения на средних частотах кубическая, а на высоких экспоненциальная, то само по себе использование PAUSE имеет смысл — это не размазывание по времени. Размазыванием по времени это было бы, если бы была линейная зависимость.