среда, 26 мая 2010 г.

Эксперимент: Mutex vs MultiCore часть 2

Почесав репу некоторое время, т.е. подумав: что же это за фигня такая и как интерпретировать полученный результат?


И думаю ответ тут вот какой:
1. Потоки выстраивались в очередь, по понятной причине (нет полезной работы кроме захвата мьютекса)
2. Синхронизация кэшей между ядрами одного процессора (два соседних ядра внутри QuadCore), где-то 50-100 тактов
3. Синхронизация кэшей между ядрами разных процессоров (2 проца внутри QuadCore), где-то 600 тактов
теперь  производим простые вычисления:
Tsync - пенальти за синхронизацию в тактах
N - количество потоков
Hz - частота
M - количество циклов (количество захватов мьютекса на один поток)
T - суммарное пинальти
T = Tsync*N*M/Hz
И получаем около 7 секунд для пукта 2 и около 80 секунд для пункта 3 при частоте 3GHz
Что более менее коррелирует с результатами теста.

За истекшее время я еще немного поупражнялся на том же самом тесте (чуть позже я его выложу)
И выявил примерно следующее соотношение: время под мьютексом + пенальти должно составлять не более 2-5 % от времени выполнения цикла для достижения линейного масштабирования, в противном случае коэффициент масштабирования будет стремительно снижаться вплоть до линейной деградации.

вторник, 13 апреля 2010 г.

Эксперимент: Mutex vs MultiCore

Стало мне тут на днях любопытно: а что будет, если я буду синхронизировать очень короткие задачи (мьютекс на входе в контейнер)
Сделал тест: контейнер с примитивом синхронизации и несколько потоков с возможностью привязки к ядру процессора, в качестве примитива был выбран мой любимый tbb::spin_mutex (пробовал boost::mutex результаты удручающиее).