tag:blogger.com,1999:blog-13976573080873824192024-03-19T11:05:08.737+03:00Zooma CodeКое-что, о построении масштабируемых систем, С++ и не только.Голубцов Антонhttp://www.blogger.com/profile/03398694865237296757noreply@blogger.comBlogger3125tag:blogger.com,1999:blog-1397657308087382419.post-2127723475587527212010-05-26T09:35:00.002+04:002010-05-26T10:26:22.085+04:00Эксперимент: Mutex vs MultiCore часть 2Почесав репу некоторое время, т.е. подумав: что же это за фигня такая и как интерпретировать полученный результат?<br />
<br />
<br />
И думаю ответ тут вот какой:<br />
1. Потоки выстраивались в очередь, по понятной причине (нет полезной работы кроме захвата мьютекса) <br />
2. Синхронизация кэшей между ядрами одного процессора (два соседних ядра внутри QuadCore), где-то 50-100 тактов<br />
3. Синхронизация кэшей между ядрами разных процессоров (2 проца внутри QuadCore), где-то 600 тактов<br />
теперь производим простые вычисления:<br />
Tsync - пенальти за синхронизацию в тактах<br />
N - количество потоков<br />
Hz - частота<br />
M - количество циклов (количество захватов мьютекса на один поток)<br />
T - суммарное пинальти<br />
T = Tsync*N*M/Hz<br />
И получаем около 7 секунд для пукта 2 и около 80 секунд для пункта 3 при частоте 3GHz<br />
Что более менее коррелирует с результатами теста.<br />
<br />
За истекшее время я еще немного поупражнялся на том же самом тесте (чуть позже я его выложу)<br />
И выявил примерно следующее соотношение: время под мьютексом + пенальти должно составлять не более 2-5 % от времени выполнения цикла для достижения линейного масштабирования, в противном случае коэффициент масштабирования будет стремительно снижаться вплоть до линейной деградации.Голубцов Антонhttp://www.blogger.com/profile/03398694865237296757noreply@blogger.com0tag:blogger.com,1999:blog-1397657308087382419.post-37434246237330012252010-04-13T11:02:00.002+04:002010-05-26T09:37:46.327+04:00Эксперимент: Mutex vs MultiCoreСтало мне тут на днях любопытно: а что будет, если я буду синхронизировать очень короткие задачи (мьютекс на входе в контейнер)<br />
Сделал тест: контейнер с примитивом синхронизации и несколько потоков с возможностью привязки к ядру процессора, в качестве примитива был выбран мой любимый tbb::spin_mutex (пробовал boost::mutex результаты удручающиее).<br />
<a name='more'></a><br />
Запустил сначала на своей машине с процессором Pentium 4, выполнил тест без привязки к ядрам, потом все потоки на одно ядро, затем все потоки на разные ядра. Но Pentium 4 всего одно ядро и результаты запусков не особо различались, что не удивительно. Затем решил прогнать тест на Xeon Core 2 Quad (для упрощения маркировок), сначала прогнал тест привязав все потоки на одно ядро для получения эталона производительности при последовательном выполнении, затем без привязки и несколько тестов с различными хитрыми привязками.<br />
Результаты всех запусков чуть ниже.<br />
<br />
Все мы знаем, что Core 2 Quad это 2 изолированных Core 2 Duo в одном корпусе, без единого L3 или L2 между ними, есть только L2 на 2 ядра, и естественным было ожидать некоторое пенальти из-за синхронизации кэшей внутри Core 2 Duo или между ними, но что бы всё было настолько грустно, я не ожидал.<br />
Впрочем время работы теста внутри одного Core 2 Duo было вполне сопоставимо с временем на одном ядре. Так же следует отметить, что при выполнении теста ядра на которых выполняли потоки были загружены на 100%, т.е. 4 потока на одном ядре работали X секунд и полностью задействовали 1 ядро, 4 потока на 2-х ядрах отрабатывали за те же X секунд, но использовали уже 2 ядра.<br />
<br />
Естественно можно говорить, что в реальной жизни такого не бывает и прочее бла-бла-бла, но цель теста не доказать или показать, как плохи/хороши примитивы, а ответить на вопрос: А что если?<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhr-ATUigSkUj5GYczD3DjS7uA91xcprocrGcqKur-rWkjEMtZ6hQlvvJ5mGYhXlwTjUbQ-c358FwYl_QUmxdi087jRkvx3XOmVMy3lEjyzfar-R4Aa4EZHUEFg9YOlGgji8lbG3EoI2TE/s1600/multicoretest.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="220" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhr-ATUigSkUj5GYczD3DjS7uA91xcprocrGcqKur-rWkjEMtZ6hQlvvJ5mGYhXlwTjUbQ-c358FwYl_QUmxdi087jRkvx3XOmVMy3lEjyzfar-R4Aa4EZHUEFg9YOlGgji8lbG3EoI2TE/s400/multicoretest.PNG" width="400" /></a></div>Голубцов Антонhttp://www.blogger.com/profile/03398694865237296757noreply@blogger.com1tag:blogger.com,1999:blog-1397657308087382419.post-3593026962572601912010-04-09T09:04:00.000+04:002010-04-09T09:04:38.986+04:00Пополнение в полезных ссылках: книга The Boost C++ LibrariesТут коллеги подсказали одну интересную ссылку: <a href="http://en.highscore.de/cpp/boost/">книга The Boost C++ Libraries</a><br />
Всё подробно расписано для таких как я чайников :)Голубцов Антонhttp://www.blogger.com/profile/03398694865237296757noreply@blogger.com0