У меня есть код Fortran, структурированный как показано ниже, который вызывает C векторизованных функций. Я хочу знать правильный способ распараллеливания этого кода с OpenMP, чтобы избежать создания избыточных потоков для циклов внутри функций. Я написал рабочую версию, которая использует «параллельный для» перед каждым циклом for, но эта версия создает потоки при каждом вызове функций, что составляет около миллиардов раз, и я хочу минимизировать накладные расходы на создание / уничтожение потоков много раз.
Для этого я поместил параллельный регион в цикл основной программы для подпрограммы sub1, единственной, которая нуждается в распараллеливании. Я сомневаюсь, что подпрограммы и векторизованные функции будут без необходимости выполняться каждым потоком. Как заставить работать только циклы for параллельно с потоками, созданными / уничтоженными в основной программе?
Если вам нужна дополнительная информация о коде, пожалуйста, дайте мне знать.
program main
it=0
do while(it < nt)
call sub0()
!$omp parallel
call sub1()
!$omp end parallel
call sub2()
it=it+1
end do
end program main
subroutine sub1()
t=0 ! this variable is global, so threadprivate is used in the Fortran module
do while(t < dt)
call sub1a(t0)
call sub1b()
t=t+t0
end do
end subroutine sub1
subroutine sub1a()
vecsub1ainC(vars) ! call to vectorized C function
compute t0 with vars
do more computations
end subroutine sub1a
vecsub1ainC(vars)
{
// loop vectorized with Intel intrinsics
#pragma omp for
for(i=0;i<n;i++)
{
do computations with vars
}
}
subroutine sub1b()
vecsub1binC(vars) ! call to vectorized C function
do more computations
end subroutine sub1b
vecsub1binC(vars)
{
// loop vectorized with Intel intrinsics
#pragma omp for
for(i=0;i<n;i++)
{
do computations with vars
}
}