Я пишу программу на C ++ для моделирования конкретной системы. Для каждого временного шага большая часть выполнения занимает один цикл. К счастью, это смущающе параллельно, поэтому я решил использовать Boost Threads для его распараллеливания (я работаю на 2-ядерном компьютере). Я ожидал бы при ускорении, близком к 2 разу серийной версии, так как здесь нет блокировки. Однако я нахожу, что ускорения вообще нет.
Я реализовал параллельную версию цикла следующим образом:
Я использовал этот подход, поскольку он должен обеспечить хорошее распределение нагрузки (поскольку каждое вычисление может занимать разное количество времени). Мне действительно любопытно, что может вызвать это замедление. Я всегда читал, что атомарные переменные работают быстро, но теперь я начинаю задумываться, не влияют ли они на производительность.
Если у кого-то есть идеи, что искать или какие-либо подсказки, я был бы очень признателен. Я целую неделю ломал голову над ним, и профилирование мало что показало.
РЕДАКТИРОВАТЬ: Проблема решена!
Я собираюсь подробно рассказать, как я решил эту проблему. Я снова использовал gprof, но на этот раз скомпилирован без флага оптимизации (-O3). Профилировщик сразу же указал, что я потратил невероятное количество времени на функцию, которая выполняет вычисления для каждой отдельной частицы: гораздо больше, чем в серийной версии.
Эта функция является виртуальной и доступна полиморфно. Я изменил код для доступа к нему напрямую, а не через vtable, и вуаля - параллельная версия вызвала ускорение почти на 2! То же самое изменение в серийной версии имело небольшой эффект.
Я не уверен, почему это так, и было бы интересно, если кто-нибудь знает!
Спасибо всем авторам. Вы все в некоторой степени помогли, и будет очень трудно принять один ответ.