powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Размещение в памяти переменных на чистом Си
5 сообщений из 30, страница 2 из 2
Размещение в памяти переменных на чистом Си
    #38962197
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivА кэш или не кэш - в десятки раз, что немного.
Наверно можно в синтетических тестах до 10 раз ускориться, но в реале максимум в 2-3 раза на современном железе. Например у меня при поиске простых двухкратное ускорение получилось за счет уменьшения окна обсчитываемого за раз. Это при том что количество мат.операций заметно увеличивалось. Я так понимаю окно просто стало целиком влезать в кэш проца.

ИМХУ попадание в кэш проца было актуально когда память была DDR2, на DDR3 работало намного шустрее с тем же процом.
Сейчас уже на подходе DDR4 с частотой 3 ГГц, с такой памятью разница в скоростях обращения к кэшу и к памяти вообще станет незначительной.

MasterZivглавный источник оптимизации программы - это алгоритм обработки данных
И надо оптимизироваться в сторону распараллеливания, т.к. ускорение процов и памяти свыше 3-4 ГГц не стоит ожидать в ближайшем обозримом будущем. А многоядерные процы готовы выпускать все, только применения им практически нет, т.к. очень мало задач хорошо поддающихся распараллеливанию.
...
Рейтинг: 0 / 0
Размещение в памяти переменных на чистом Си
    #38962636
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
S70Dimitry Sibiryakov,

извини, конечно, за прямоту. Твой ответ называется "ответом программиста" - абсолютно точный и настолько же бесполезный.
Есть данные. Поступают они с разной интенсивностью, которая в первом приближении - понятна. Когда данные криво лежат, проц постоянно промахивается по кешу, кроме того, забирает из памяти данные, которые ему сейчас не нужны. Как минимум, я хочу разнести данные с разной интенсивностью обновления.
Насколько я помню, L1 кеш имеет/имел линию в 32 байт. Т.ч. все что больше - глубоко пофиг будут рядом или не рядом (TLB пока не рассматриваем).

Про оптимизацию под L2 / L3 кеш я как-то даже и не слышал

Кроме того, в процессоре out of order execution. Если для какой-то инструкции данные еще не прибыли, но есть следующие инструкции которые можно выполнить - процессор все равно простаивать не будет.

Локальные и глобальные переменные модуля (.C файл) - все равно лежат "рядом". Компилятор и будет их размешать ровно так, так они описаны в приложении.

Тут главное не словить промахи при выполнении, но это нужно брать реальное приложение и запускать под чем нибудь типа Intel VTune (пользовался в начале 2000-х). Промахи могут быть совершенно "экзотические" и крайне удивительные. Лично я напарывался на промах обращения к выравненным данным после обращения к невыравненным (алгоритм такой был). Так там наоборот: то что данные попали в одну линию кеша - как раз и было проблемой. Попадали бы в разные линии, промаха бы не было )))

Т.ч. самая главная "оптимизация" не плодить лишних переменных и сущности )))

Если речь идет о выделении памяти через new / mallloc - тут тоже все сказали. Просто выделяйте одну область и ее используйте.

S70Поступают они с разной интенсивностью, которая в первом приближении - понятна. Когда данные криво лежат, проц постоянно промахивается по кешу
Тут ключевой вопрос ОТКУДА и КАК поступают данные.

Если данные поступают по сети - тут не ЯДРО проца по кешу может промахнуться, а прерывание от сетевой карты не на то ядро придти ))) (если проц многоядерный). А при таком "промахе" никакой кеш не поможет, ядро совсем другое

Если же система многозадачная, то как бы Вы не оптимизировали, скорее всего в промежутках между поступлениями данных все кеши уже кто нибудь выбьет напрочь (другой поток, ОС, сетевой драйвер и так далее).

Если данные приходят по сети (а она скорее всего TCP/IP) Оптимизировать можно, но тут проблемы AFAIK совсем другого уровня. Взаимодействие железа + прерывания + ядро проца + драйвер + ОС + прикладной софт. Но AFAIK этим занимаются только производители ОЧЕНЬ дорогого и специфического железа. Всякая китайская дешевка ))) типа Ethernet 10 G и их драйвера на такое внимание не обращают. Т.ч. там хоть оптимизируй прикладной соофт хоть нет - ничто не поможет ))). Только выкидывать нафиг устаревший TCP/IP и переходить на что нибудь более современное ))) AFAIK
...
Рейтинг: 0 / 0
Размещение в памяти переменных на чистом Си
    #38962824
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevНасколько я помню, L1 кеш имеет/имел линию в 32 байт.
в i7 L1,L2,L3 имеют линию 64 байта.

для борьбы с TLB - большие страницы выделять
...
Рейтинг: 0 / 0
Размещение в памяти переменных на чистом Си
    #38962832
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevТолько выкидывать нафиг устаревший TCP/IP и переходить на что нибудь более современное )))
PGM , например
...
Рейтинг: 0 / 0
Размещение в памяти переменных на чистом Си
    #38962917
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут надо оптимизировать применительно к алгоритму и к железке. Без этих знаний получается
философская беседа.
...
Рейтинг: 0 / 0
5 сообщений из 30, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Размещение в памяти переменных на чистом Си
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]