Я написал довольно сложную программу, которая имитирует поведение мелких клеток-подобных организмов в системе частиц.Многопоточность моделирования в C++
Моделирование проходит через несколько этапов, где вычисляется следующая позиция для каждого объекта в моделировании. Функция-член движения «движение» вызывается для каждой частицы и организма в симуляции, которая обновляет его векторы перемещения (в случае организма он обрабатывает AI и движение). Затем функция рендеринга выполняет итерацию по каждому объекту и рисует соответствующую форму при новом перемещении каждого объекта.
Вычисления смещения для каждого объекта выполняются несколько сотен раз перед визуализацией кадра, что позволяет имитировать работу намного быстрее.
В этом процессе невозможно вычислить следующую позицию объектов, не зная текущей позиции (из-за последовательной природы процесса), поэтому я не могу дать «блок» кадров для вычисления нескольких потоки - каждый кадр основывается на вычислении предыдущего.
Как я уже упоминал ранее, новые позиции каждого объекта вычисляются путем итерации по каждому объекту и вызова функции-члена текущего объекта, которая вычисляет новое положение для этого конкретного объекта. Мне было интересно, можно ли сделать этот процесс параллельно - вычислить одну четверть объектов в одном потоке, еще одну четверть во втором потоке и т. Д. Возможно ли это, и улучшит ли скорость вычислений для каждого кадра, когда огромное количество объектов в симуляции?
Если объекты взаимодействуют, вам необходимо организовать бесплатный доступ к гонке из разных потоков, либо путем блокировки отдельных объектов или групп объектов, либо путем сохранения копии предыдущего кадра вокруг, либо каким-либо другим способом. Блокировка отдельных объектов может съесть все ваши выгоды от многопоточности, другие варианты жизнеспособны, но некоторые эксперименты необходимы. Трудно сказать больше, не зная больше о вашей архитектуре. –