Ваш барьер должен быть правильным из того, что я вижу, до тех пор, пока вы не используете барьер часто или ваш номер нити является степенью двойки.Теоретически ваше атомное хранилище будет переполнено где-то (после сотен миллионов использований для типичного количества ядер, но все же), поэтому вы можете захотеть добавить некоторые функциональные возможности, чтобы сбросить это где-то.
Теперь о том, почему это быстрее: я не совсем уверен, но я думаю, что pthread_barrier_wait
позволит потоку спать, пока не настанет время проснуться.Ваш крутится на условии, уступая в каждой итерации.Однако, если нет другого приложения / потока, для которого требуется время обработки, поток, скорее всего, будет снова запланирован сразу после yield
, поэтому время ожидания будет короче.По крайней мере, это то, что игра с такими барьерами, похоже, указывает на мою систему.
В качестве примечания: поскольку вы используете atomic<int>
Я предполагаю, что вы используете C ++ 11.Разве не имеет смысла использовать std::this_thread::yield()
вместо sched_yield()
в этом случае для удаления зависимости от pthreads?
Эта ссылка также может быть интересна для вас, она измеряетпроизводительность различных реализаций барьера (ваш случай является грубым lock xadd+while(i<NCPU)
, кроме уступающего)