Я немного не уверен в том, что именно вы пытаетесь сделать со своими циклами и т. Д., Похоже, он будет делать квадратичный вложенный цикл по карте.Однако, если предположить, что это ожидается, я думаю, что следующая строка будет работать плохо при распараллеливании:
std::advance(datItLocal, i - lastIdx);
Если OpenMP был отключен, это продвигается на один шаг каждый раз, и это нормально.Но с OpenMP будет много потоков, которые будут делать фрагменты этого цикла случайным образом.Таким образом, один из них может начинаться с i = 100000, поэтому он должен пройти 100000 шагов по карте, чтобы начать.Это может случиться довольно часто, если за один раз много потоков получают относительно небольшие фрагменты цикла.Может даже случиться так, что вы в конечном итоге будете ограничены в памяти / кэше, поскольку вам постоянно приходится обходить всю эту предположительно большую карту.Похоже, что это может быть (частью) ваш виновник, так как это может ухудшиться, когда доступно больше потоков.
В принципе, я немного подозреваю, что пытаюсь распараллелить итерации по последовательной структуре данных.Вы можете узнать больше о том, какие его части действительно медленные или нет, хотя, если вы их профилировали.