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