Как распараллелить векторизованные циклы C внутри подпрограмм, вызываемых из параллельной области в Fortran - PullRequest
0 голосов
/ 08 октября 2019

У меня есть код 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
    }
}
...