Skip to content

perf: параллельный расчёт физики через OpenMP#40

Open
kranks-uga wants to merge 4 commits into
ElectroZybr:mainfrom
kranks-uga:perf/openmp-physics
Open

perf: параллельный расчёт физики через OpenMP#40
kranks-uga wants to merge 4 commits into
ElectroZybr:mainfrom
kranks-uga:perf/openmp-physics

Conversation

@kranks-uga

Copy link
Copy Markdown

Добавил параллельное выполнение физики через OpenMP. симуляция теперь
использует все ядра процессора.

Что изменено:
расчёт сил между атомами (ForceField.cpp)
построение списка соседей (NeighborList.cpp)
шаг интегратора (VerletScheme.cpp)
подключение OpenMP в сборке (CMakeLists.txt)

Главная сложность была в том, что расчёт сил использует третий закон
Ньютона — каждая пара атомов пишет силу сразу в два места одновременно.
Поэтому я решил создать буфер на каждый поток дабы не было гонки данных.
В конце всё суммируеться

Ожидаемое ускорение: 4–8× на 8-ядерном процессоре при 50k+ атомов.(Сам я не проверял)

@applicate2628

Copy link
Copy Markdown

Я бы использовал OneAPI TBB, он быстрее и стабильнее, хоть и новая зависимость, но хорошую вычислительную систему без OneAPI сложно представить.

@kranks-uga

Copy link
Copy Markdown
Author

perf: replace OpenMP with Intel oneAPI TBB

Перешел на TBB.
Адаптировал под новый World из main

@ElectroZybr

Copy link
Copy Markdown
Owner
image Судя по тестам и симуляции, прирост к производительости x2 при 100% загрузке проца. Видимо довольно большой оверхед на распаралливание, или боттлнек по памяти. На маленьких сценах оверхед хорошо видно, дальше немного лучше. А вот интеграция похоже перестала векторизоваться, только паралель

kranks-uga and others added 2 commits May 31, 2026 16:23
Merged main into perf/openmp-physics to resolve broken build caused by
partial World architecture adoption in the TBB commit. TBB parallelization
and vectorization fixes (ivdep + __restrict__ in lambda captures) preserved.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@kranks-uga

kranks-uga commented May 31, 2026

Copy link
Copy Markdown
Author

Я сам, не понял в чем проблема потому решил оботиться к claude.
Мы с ним покумекали и пришли к вываду что это потолок памяти, она просто не может пропускать такой обем данных у меня x3D и у меня тоже только x2 к скорости. И выходит что скорость L3 не хватает на все потоки. Я могу переделать систему хранения атамов, но это будет слишком большое изменение так как оно затронет вообще все. А так если автор не против, то я сделаю.

@ElectroZybr

Copy link
Copy Markdown
Owner

Мне интересно как будет переделана система хранения атомов, именно в чем идея заключается?

@kranks-uga

Copy link
Copy Markdown
Author

Я думаю упоковать позиции и заряд в один массив, также нужно убрать vector<vector<uint32_t>> чтобы вместо множества массивов создать один. И тогда в тиории прирост будет x4. Не так уж и много по этому и спрашиваю, стоит ли оно того?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants