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