Не уверен, что это решит проблему, но вы можете попробовать предоставить каждому потоку свою копию полного массива;проблема может заключаться в том, что потоки борются за доступ к общей памяти, и вы видите много кешей.
Я не уверен в точном синтаксисе openmp, который вы бы использовали для этого, но попробуйте сделать это:
- Выделите память для хранения всего массива частиц в каждом потоке;сделайте это один раз и сохраните все четыре новых указателя.
- В начале каждой итерации основного цикла в главном потоке глубокое копирование основного массива четыре раза в каждый из этих новых массивов.Вы можете сделать это быстро с помощью memcpy ().
- Выполните вычисления так, чтобы первый поток записывал в индексы 0 В главном потокеперед применением новых скоростей объедините четыре массива в основной массив, скопировав только соответствующие индексы.Вы можете сделать это быстро с помощью memcpy ().
- Обратите внимание, что вы можете распараллелить ваш цикл «применения новых скоростей» без проблем, потому что каждая итерация работает только с одним индексом;это, вероятно, самая простая часть для распараллеливания.
Новые операции будут только O (N) по сравнению с вашими вычислениями, которые O (N ^ 2), поэтому они не должны занимать слишком много временив долгосрочной перспективе.Определенно, есть способы оптимизировать шаги, которые я для тебя изложил, Гейб, но я оставлю их тебе.