Intel® oneAPI Math Kernel Library
Ask questions and share information with other developers who use Intel® Math Kernel Library.

## How to achieve Parallel back substitution when using Pardiso?

Beginner
388 Views

I want to speed up the procedure of back substitution, but I did not figure out what should I do.

I used to use OpenMp simply, but the reason differs.

!\$OMP parallel do
do j = 1,sub(i)%Nob
call Inver(par,pa(j)%Righthand,pa(j)%solt,2)
end do

!\$OMP end parallel do

where par is pardiso_par_t type as follows

type pardiso_par_t
type(mkl_pardiso_handle),dimension(64) :: pt
integer :: maxfct,mnum,mtype,phase,n,nrhs,error,msglvl
integer,dimension(64) :: iparm
integer,allocatable,dimension(:) :: ia,ja
complex(kind=8),allocatable,dimension(:) :: a
integer,dimension(1) :: idum
complex(kind=8),dimension(1) :: ddum
end type pardiso_par_t

and subroutine INVER is

subroutine Inver(left,right,solution,info)
use MKL_PARDISO
use MeshDefMod
implicit none
!------------------------------------------
type(pardiso_par_t),intent(inout) :: left

!righthand
complex(kind=8),allocatable,dimension(:),intent(inout) :: right

!solution
complex(kind=8),allocatable,dimension(:),intent(inout) :: solution
integer(kind=4),intent(in) :: info
!------------------------------------------
if(info == 1) then
!Reordering and Symbolic Factorization,this step also allocates
!all memory that is necessary for the factorization
left%phase = 11  !only reordering and symbolic factorization
call pardiso (left%pt, left%maxfct, left%mnum, left%mtype, left%phase, &
left%n, left%a, left%ia, left%ja,left%idum, left%nrhs, left%iparm,&
left%msglvl, left%ddum, left%ddum, left%error)
write(*,*) 'Reordering completed...'
if(left%error /= 0) then
write(*,*) 'The following ERROR was detected :',left%error
!stop 1
end if
write(*,*) 'Number of Nonzeros in factors = ', left%iparm(18)
write(*,*) 'Number of factorization MFLOPS = ',left%iparm(19)
!Factorization
left%phase = 22  !only factorizatin
call pardiso (left%pt, left%maxfct, left%mnum, left%mtype, left%phase,&
left%n, left%a, left%ia, left%ja,left%idum, left%nrhs, left%iparm,&
left%msglvl, left%ddum, left%ddum, left%error)
write(*,*) 'Factorization completed...'
if(left%error /= 0) then
write(*,*) 'The following ERROR was detected :',left%error
stop
end if
else if(info == 2) then
!left%phase = 33 !only factorization
!left%iparm(8) =0 !max number of iterative refinement steps
call pardiso (left%pt, left%maxfct, left%mnum, left%mtype, left%phase,&
left%n, left%a, left%ia, left%ja,left%idum, left%nrhs, left%iparm,&
left%msglvl, right, solution, left%error)
!write(*,*) 'Solve completed...'
else if(info == 3) then
!Termination and release of memory
left%phase = -1
call pardiso (left%pt, left%maxfct, left%mnum, left%mtype, left%phase,&
left%n, left%a, left%ia, left%ja,left%idum, left%nrhs, left%iparm,&
left%msglvl, left%ddum, left%ddum, left%error)
end if
end subroutine Inver

1 Solution
Employee
388 Views

Hello,

If you want to have OpenMP-based parallel back substitution, you can just set the number of OpenMP threads (e.g., from the environment variables MKL_NUM_THREADS and OMP_NUM_THREADS) or by calling mkl_set_num_threads, or other options listed at https://software.intel.com/en-us/mkl-macos-developer-guide-techniques-to-set-the-number-of-threads, and call pardiso, you don't need to do an OpenMP do-loop.

I hope you'll find this useful.

4 Replies
Beginner
388 Views

And my pardiso control parameters are

iparm(1) = 1

iparm(2) = 3

iparm(11) = 1

iparm(25) = 2

Beginner
388 Views

After check and correct, I only have one question to ask:

Parallel Direct Factorization is running on 1 OpenMP

It should be Parallel Direct Factorization is running on 8 OpenMP I guess if I want to accelerate the backup substitution procedure, So what iparm should I set?

Employee
389 Views

Hello,

If you want to have OpenMP-based parallel back substitution, you can just set the number of OpenMP threads (e.g., from the environment variables MKL_NUM_THREADS and OMP_NUM_THREADS) or by calling mkl_set_num_threads, or other options listed at https://software.intel.com/en-us/mkl-macos-developer-guide-techniques-to-set-the-number-of-threads, and call pardiso, you don't need to do an OpenMP do-loop.

I hope you'll find this useful.

Beginner
388 Views

Voronin, Kirill (Intel) wrote:

Hello,

If you want to have OpenMP-based parallel back substitution, you can just set the number of OpenMP threads (e.g., from the environment variables MKL_NUM_THREADS and OMP_NUM_THREADS) or by calling mkl_set_num_threads, or other options listed at https://software.intel.com/en-us/mkl-macos-developer-guide-techniques-to..., and call pardiso, you don't need to do an OpenMP do-loop.