Я могу подумать о двух возможных источниках замедления: а) компилятор сделал некоторые оптимизации (векторизация в первую очередь) в последовательной версии, но не в версии OpenMP, и б) накладные расходы на управление потоками.И то, и другое легко проверить, запускаете ли вы также версию OpenMP с одним потоком (т. Е. Установите для numThreads значение 1).Если это намного медленнее, чем последовательное, то (а) является наиболее вероятной причиной;если он аналогичен последовательному и быстрее, чем тот же код с 2 потоками, наиболее вероятной причиной является (b).
В последнем случае вы можете реструктурировать код OpenMP для уменьшения накладных расходов.Во-первых, наличие двух параллельных областей (#pragma omp parallel) внутри цикла не обязательно;у вас может быть одна параллельная область и два параллельных цикла внутри нее:
for (t = 0; t <= numTimeSteps; t++) {
#pragma omp parallel num_threads(numThreads)
{
#pragma omp for private(j)
/* The first loop goes here */
#pragma omp for
/* The second loop goes here */
}
}
Затем параллельная область может быть запущена до цикла временного шага:
#pragma omp parallel num_threads(numThreads) private(t)
for (t = 0; t <= numTimeSteps; t++) {
...
}
Каждый поток в областизатем запустит этот цикл, и на каждой итерации потоки будут синхронизироваться в конце циклов OpenMP.Таким образом, вы гарантируете, что один и тот же набор потоков будет проходить через все вычисления независимо от используемой реализации OpenMP.