Какие варианты у меня есть, если я хочу перезапустить c память и использовать 32 (или 64) байтовое выравнивание? - PullRequest
1 голос
/ 03 мая 2020

Я пишу код SIMD. Мне нужно, чтобы мои массивы были выровнены до 32 байт с возможностью обновления до 64 байт, если я когда-нибудь решу ориентироваться на процессор, который поддерживает 512-битные инструкции simd.

Из того, что я могу сказать, reallo c не делает Кажется, держать какие-либо обещания о выравнивании. Кажется, что mallo c и reallo c будут гарантировать только 8 байтов / 64 бита?

Не пишите свои собственные, какие у меня есть варианты, если я хочу перераспределить часть памяти?

1 Ответ

0 голосов
/ 03 мая 2020

Существует std::align, который можно использовать для получения указателя на выровненную область памяти. Вы можете проверить, выравнивается ли перераспределенная область, сравнив указатель с результатом std::align. В противном случае memmove() может быть необходимым.

Существует также std::aligned_storage, который может быть опцией для выровненных распределений фиксированной (т. Е. Во время компиляции) части.


Возможной стратегией реализации может быть распределитель, который извлекает память из указанного c пула памяти. Пул памяти возвращает только память, выровненную по std::align или может управлять блоками std::aligned_storage. Этот подход также дает вам все преимущества пулов памяти, например, локальность кэша, отсутствие фрагментации памяти и, возможно, более быстрые алгоритмы выделения (зависит от реализации ваших пулов и malloc).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...