Многопоточная производительность и профилирование - PullRequest
7 голосов
/ 12 февраля 2012

У меня есть программа, которая плохо масштабируется на несколько потоков, хотя - теоретически - она ​​должна масштабироваться линейно: это вычисление, которое разбивается на более мелкие куски и не требует системных вызовов, библиотечных вызовов, блокировки и т. Д. Запуск с четырьмя потоками это примерно в два раза быстрее, чем работа с одним потоком (в четырехъядерной системе), в то время как я ожидаю, что число будет в четыре раза быстрее.

Время выполнения реализаций с pthreads, потоками C ++ 0x и OpenMP совпадает.

Чтобы точно определить причину, я попробовал gprof (бесполезный) и valgrind (я не видел ничего очевидного). Как я могу эффективно оценить, что вызывает замедление? Какие-нибудь общие идеи относительно его возможных причин?

- Обновление -

Расчет включает интеграцию Монте-Карло, и я заметил, что на создание случайных чисел уходит неоправданное количество времени. Хотя я еще не знаю, почему это происходит с четырьмя потоками, я заметил, что генератор случайных чисел не реентерабелен. При использовании мьютексов время работы взрывается. Я переопределю эту часть, прежде чем проверять другие проблемы.

Я переопределил классы выборки, которые существенно улучшили производительность. Фактически, оставшейся проблемой было состязание кэшей ЦП (это было обнаружено с помощью cachegrind, как подозревал Евгений).

1 Ответ

4 голосов
/ 12 февраля 2012

Вы можете использовать oprofile.Или псевдо-профилировщик бедного человека: запустите программу под gdb, остановите ее и посмотрите, где она остановлена.«valgrind --tool = cachegrind» покажет вам, насколько эффективно используется кэш процессора.

Интеграция с Монте-Карло, похоже, требует очень много памяти.Попробуйте оценить, как используется пропускная способность памяти.Это может быть ограничивающим фактором для производительности вашей программы.Кроме того, если ваша система только с 2 ядрами с гиперпоточностью, она не должна работать намного быстрее с 4 потоками по сравнению с 2 потоками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...