Многопоточная производительность и профилирование

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

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

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

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

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

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

7
задан jk4736 19 February 2012 в 11:56
поделиться