У меня есть программа, которая плохо масштабируется на несколько потоков, хотя - теоретически - она должна масштабироваться линейно: это вычисление, которое разбивается на более мелкие куски и не требует системных вызовов, библиотечных вызовов, блокировки и т. Д. Запуск с четырьмя потоками это примерно в два раза быстрее, чем работа с одним потоком (в четырехъядерной системе), в то время как я ожидаю, что число будет в четыре раза быстрее.
Время выполнения реализаций с pthreads, потоками C ++ 0x и OpenMP совпадает.
Чтобы точно определить причину, я попробовал gprof (бесполезный) и valgrind (я не видел ничего очевидного). Как я могу эффективно оценить, что вызывает замедление? Какие-нибудь общие идеи относительно его возможных причин?
- Обновление -
Расчет включает интеграцию Монте-Карло, и я заметил, что на создание случайных чисел уходит неоправданное количество времени. Хотя я еще не знаю, почему это происходит с четырьмя потоками, я заметил, что генератор случайных чисел не реентерабелен. При использовании мьютексов время работы взрывается. Я переопределю эту часть, прежде чем проверять другие проблемы.
Я переопределил классы выборки, которые существенно улучшили производительность. Фактически, оставшейся проблемой было состязание кэшей ЦП (это было обнаружено с помощью cachegrind, как подозревал Евгений).