NGX_POOL_ALIGNMENT
Maxim Dounin
mdounin на mdounin.ru
Ср Сен 27 03:35:19 UTC 2017
Hello!
On Tue, Sep 26, 2017 at 11:33:50AM +0300, Oleg wrote:
> On Mon, Sep 25, 2017 at 02:44:47PM +0300, Maxim Dounin wrote:
> >
> > Абсолютно. Ну то есть это, безусловно, зависит от многих
> > факторов, но на Линуксе со штатным аллокатором на 64-битных
> > платформах - будет 16:
> >
> > https://www.gnu.org/software/libc/manual/html_node/Aligned-Memory-Blocks.html
> >
> > : The address of a block returned by malloc or realloc in GNU
> > : systems is always a multiple of eight (or sixteen on 64-bit
> > : systems).
>
> Спасибо за ссылку. Похоже man для memalign забыли поправить для
> 64-битных процессоров.
> Для общего понимания, если отвлечься от конкретно ngx_pool,
> выравнивания в 8 байт для целых типов(кроме float, double и прочих
> SSE/AVX) достаточно для быстрого доступа?
> Например, мы выделяем большой кусок памяти и в нём уже выделяем куски
> поменьше под всякие char* и выравниваем их на границы 8 байт.
Для переменных простых типов - выравнивания на 8 байт AFAIK
достаточно, чтобы процессор работал быстро (если не брать в расчёт
SIMD-инструкции).
Дальше могут начинаться всякие нюансы, например, с cacheline size:
e.g., если мы работаем со структурой в 64 байта размером, и
cacheline size у нас 64, то выравнивать лучше на те же 64 - тогда
вся структура будет загружаться в кеш процессора сразу. Если же
выравнивать на 8, то одна структура с высокой вероятностью
разъедется по двум строкам кеша, и соответственно работать это
будет медленнее, чем могло бы.
--
Maxim Dounin
http://nginx.org/
Подробная информация о списке рассылки nginx-ru