Невозможно ответить, учитывая предоставленную информацию, но можно предположить, что ваш код разработан так, что он не может быть эффективно выполнен в нескольких потоках.
Я мало работал с OMP,но я считаю, что разрешено использовать меньше рабочих потоков, чем указано.В этом случае некоторые реализации могут быть достаточно умными, чтобы понять, что код не может быть эффективно распараллелен, и просто запустить его в одном потоке, в то время как другие наивно пытаются запустить его на 4 ядрах и страдают от снижения производительности (из-заложный (или реальный) обмен, например)
Некоторая информация, которая понадобится для того, чтобы дать вам разумный ответ:
- фактическое время (как долгокода требуется для запуска в одном потоке? Сколько времени с 4 потоками, использующими OM? Как долго с 4 потоками, использующими "обычные" потоки?
- расположение данных: какие данные размещены, где и когда этодоступ?
- что на самом деле происходит внутри цикла? Все, что мы можем видеть в данный момент, это умножение и вызов функции. Пока мы не знаем, что происходит внутри функции, вы могли бы также опубликоватьэтот код:
foo(42)
и спросил, почему он не возвращает ожидаемый результат.