Pull to refresh

Comments 7

Спинлоки в юзерспейсе - ну такое. Пользовательский код начинает воевать с шедуллером ядра. Здесь Линус Торвальдс расписал, какие подводные камни могут вылезть, и почему спинлоки в юзерспейсе - плохо.

мютексы в пределенных видах приложений (например игровые движки) использовать очень дорого, время блокировки мютекса составляет 10-15к циклов процессора, да еще и гарантированный вызов в ядро. Зачастую дешевле и быстрее подождать ресурс в спинлоке

Зачастую дешевле и быстрее подождать ресурс в спинлоке

Обычно хватает однократной проверки на cmpxchg и затем уйти в использование ядерных примитивов блокировок, т.к. реальный contention случается довольно редко.

А для примера со счетчиком лучше сделать несколько отдельных счетчиков (по одному на CPU), чтобы параллельные исполняющиеся потоки за них не воевали, и, когда нужен результат, просто агрегировать с них сумму

да, есть комбинированные подходы, например подождать 5к циклов на спинлоке, а потом уже уходить в мютекс, на плойке он дает лучший результат чем использование системного мютекса, но использование сисколов стараются стараются избегать изза их дороговизны. Платформы предоставляют хорошую документацию, но все таки они остаются черными ящиками, из недавних примеров на живой ps5 велосипед memcpy на AVX регистрах до 16кб выигрывает примерно 2х перед crt реализацией, к 32кб они сравниваются, дальше уже выигрывает реализация в ОС

Например, код https://github.com/Novum/vkQuake/blob/6fe4b4bfec8e7be89da93a0a9818850cdeca9cff/Quake/tasks.c#L129 жрет 25% CPU в этом месте на интро согласно perf, если его переписать на однократную проверку + мьютекс, то потребление CPU снижается до 10% без просадки производительности. В мастере код уже переписан, но автор-игродел (Axel Gneiting) все равно не отказался от своей веры крутить спинлоки (хоть и существенно меньше циклов (100), а не 3к как в первоначальном варианте)

Хороший пример, надо будет написать тестов и посмотреть. Я заметил ниже коварный SDL_Delay(0) -> Sleep(0), который в худшем случае выкинет тред в планировщик с неопределенным временем возврата обратно, не было проблем с этим?
одинаковые числа лучше не крутить, какое-нибудь exponent backoff wait даст лучший результат

SDL_Delay(0)

Это как sched_yield(), только для бедных, но тоже так себе вариант :D

не было проблем с этим?

На самом деле не знаю, лучше узнать у того, кто perf снимал: https://t.me/itpgchannel/435

Sign up to leave a comment.

Articles