Size: a a a

2021 February 27

AG

Alex Garustovich in pro.cxx
Вот посмотрите, плз, в линуксах что:
The futex() system call provides a method for waiting until a certain condition becomes true... When using futexes, the majority of the synchronization operations are performed in user space. A user-space program employs the futex() system call only when it is likely that the program has to block for a longer time until the condition becomes true.
как я понимаю, futex ф-ция в glibc не сразу вызывает syscall, а сначала пытается синкануться в user-space, это правда? т.е. она сначала пытается сделать атомарную CAS об uint32_t переменную?
источник

EP

Egor Pugin in pro.cxx
Alex Garustovich
Вот посмотрите, плз, в линуксах что:
The futex() system call provides a method for waiting until a certain condition becomes true... When using futexes, the majority of the synchronization operations are performed in user space. A user-space program employs the futex() system call only when it is likely that the program has to block for a longer time until the condition becomes true.
как я понимаю, futex ф-ция в glibc не сразу вызывает syscall, а сначала пытается синкануться в user-space, это правда? т.е. она сначала пытается сделать атомарную CAS об uint32_t переменную?
посмотри в исходниках напрямую
источник

AG

Alex Garustovich in pro.cxx
почитал доку дальше, увидел, что: "Glibc does not provide a wrapper for this system call; call it using syscall"
источник

AG

Alex Garustovich in pro.cxx
тогда о каком user-space говорится выше - не ясно
источник

EP

Egor Pugin in pro.cxx
Alex Garustovich
тогда о каком user-space говорится выше - не ясно
там написано, что обычно вся синхронизация в юзер спейсе. А вот когда надо залочиться дольше, то тут futex()
источник

AG

Alex Garustovich in pro.cxx
а ок, т.е. имеется ввиду, что юзер сам синхронизируется в user space как хочет, и только, если нужно, вызывает futex
источник

AG

Alex Garustovich in pro.cxx
а я подумал, что futex внутри в user-space что-то делает
источник

AG

Alex Garustovich in pro.cxx
спасибо
источник

m

magras in pro.cxx
Alex Garustovich
Вот посмотрите, плз, в линуксах что:
The futex() system call provides a method for waiting until a certain condition becomes true... When using futexes, the majority of the synchronization operations are performed in user space. A user-space program employs the futex() system call only when it is likely that the program has to block for a longer time until the condition becomes true.
как я понимаю, futex ф-ция в glibc не сразу вызывает syscall, а сначала пытается синкануться в user-space, это правда? т.е. она сначала пытается сделать атомарную CAS об uint32_t переменную?
На сколько я помню дизасм, там действительно в начале идет быстрый пусть с одним атомиком. Но в сырцах я не копался.
источник

AS

Anatoly Shirokov in pro.cxx
Dmitriy
Вопрос по повышению производительности Pimpl.
Помню, на одной из конференций @antoshkka показывал идею с конструированием объекта на aligned_storage_t в том же классе, где лежит Impl*
Насколько такое решение позволило повысить производительность на практике?
это решение же не про производительность (не столько о ней), а про снижение фрагментации памяти, когда холдер содержит в себе состояние pimpl. а раз сам объект и его состояние реализации расположены в одном блоке памяти ты не получаешь cache miss. за счет этого у тебя получается прирост, но на сколько все сильно зависит от реализации твоих методов. надо мерять.
источник

D

Dmitriy in pro.cxx
Anatoly Shirokov
это решение же не про производительность (не столько о ней), а про снижение фрагментации памяти, когда холдер содержит в себе состояние pimpl. а раз сам объект и его состояние реализации расположены в одном блоке памяти ты не получаешь cache miss. за счет этого у тебя получается прирост, но на сколько все сильно зависит от реализации твоих методов. надо мерять.
К сожалению, на моей платформе адекватного профайлера нет :(
источник

D

Dmitriy in pro.cxx
Внутри impl будут лежать обработчики и пара lockfree-очередей, основные задачи "внешнего" класса - скопировать данные и пихнуть в очередь
источник

AS

Anatoly Shirokov in pro.cxx
Dmitriy
К сожалению, на моей платформе адекватного профайлера нет :(
но при прочих равных ты так или иначе получаешь профит: нет лишней аллокации памяти для pimpl, избавляешься от cache miss. но а из недостатков: надо знать размер состояния pimpl в месте объявления холдера.
источник

D

Dmitriy in pro.cxx
Anatoly Shirokov
но при прочих равных ты так или иначе получаешь профит: нет лишней аллокации памяти для pimpl, избавляешься от cache miss. но а из недостатков: надо знать размер состояния pimpl в месте объявления холдера.
Можно не считать недостаток значимым: просто рассчитывать и ставить контрольный static_assert :)
источник

AS

Anatoly Shirokov in pro.cxx
Dmitriy
Можно не считать недостаток значимым: просто рассчитывать и ставить контрольный static_assert :)
я согласен
источник

AS

Anatoly Shirokov in pro.cxx
просто одним из профитов pimpl было сокращение времени компиляции при устоявшемся интерфейсе. если состояние pimpl стабилизировано, то все отлично. если нет, и оно будет меняться, то перекомпиляция холдера неизбежна.
источник

AS

Anatoly Shirokov in pro.cxx
с этим тоже можно бороться, выбирая заведомо больший размер памяти под состояние. но в общем, преимущества перебивают эти недостатки.
источник

D

Dmitriy in pro.cxx
Anatoly Shirokov
просто одним из профитов pimpl было сокращение времени компиляции при устоявшемся интерфейсе. если состояние pimpl стабилизировано, то все отлично. если нет, и оно будет меняться, то перекомпиляция холдера неизбежна.
В моем случае важнейшая задача - по-минимуму "светить" реализацию в хедере с API
источник

ПК

Побитый Кирпич... in pro.cxx
Dmitriy
Можно не считать недостаток значимым: просто рассчитывать и ставить контрольный static_assert :)
Там проблема не только в необходимости расчёта, а в том, что у тебя размер имплементации влияет на ABI. В обычном pimpl нет слома ABI при добавлении поля, например, а тут будет.
источник

ПК

Побитый Кирпич... in pro.cxx
Dmitriy
В моем случае важнейшая задача - по-минимуму "светить" реализацию в хедере с API
размер это тоже отчасти свечение
источник