- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hey there,
my dss implementation freezes the whole system, probably due running out of memory, when switching from positive_definite to indefinite.
The matrix provided to dss is 4x4, so not a big problem, but it is negative definite.
The module implementing the solver is:
include "mkl_dss.f90" Module ModMKLSolver use Data_Kind use ModEquation use ModLogfile Implicit none Type MKLSolver Type(Equation) :: TSEq contains Procedure, Pass, Public :: Solve => SubSetPEVDSS End type MKLSolver Private :: SubSetPEVDSS contains Subroutine SubSetPEVDSS(this,ISSubStat) use MKL_DSS Implicit None Class(MKLSolver), Target, Intent(InOut) :: this Integer(Iks), Intent(InOut) :: ISSubStat Integer(Ikxl) :: c1, c2 TYPE(MKL_DSS_HANDLE) :: handle Integer(Ikxl) :: ISError Integer(Ikl) :: opt, a, ISSize Integer(Ikl), Allocatable, Dimension(:) :: IVPermu ISSize=this%TSEq%TSLHS%ISDim Allocate(& &IVPermu(ISSize),& &stat=ISSubStat) If(ISSubStat==0) Then IVPermu=0 this%TSEq%RVsol=0._rkdbl ISSubStat=dss_create(handle, MKL_DSS_MSG_LVL_WARNING& &+MKL_DSS_TERM_LVL_ERROR) If(ISSubStat==0) Then ISSubStat=dss_define_structure(handle=handle,& &opt=MKL_DSS_SYMMETRIC,& &rowIndex=this%TSEq%TSLhs%IVRowPos,& &nRows=ISSize,& &RCols=ISSize,& &columns=this%TSEq%TSLhs%IVColPos,& &nNonZeros=size(this%TSEq%TSLhs%RVCoeff)) End If If(ISSubStat==0) Then ISSubStat=dss_reorder(handle=handle, opt=MKL_DSS_GET_ORDER, perm& &=IVPermu) end If If(ISSubStat==0) Then ISSubStat=dss_factor(handle=handle,& !&opt=MKL_DSS_POSITIVE_DEFINITE,& &opt=MKL_DSS_INDEFINITE,& &RValues=this%TSEq%TSLhs%RVCoeff) End If If(ISSubStat==0) Then ISSubStat=dss_solve(handle=handle,& &opt=0,& &RRhsValues=this%TSEq%RVRHS,& &nRhs=1,& &RSolValues=this%TSEq%RVSol) End If End If end Subroutine SubSetPEVDSS end Module ModMKLSolver
The implementation works with setting "positive_definite" and matrices which abide by that rule.
Compiler: ifort 15, System: ubuntu 14.04
Any suggestions??
Thanks
Karl
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I relocated this post to the MKL forum.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi May,ka,
Could you please attach the fortran file ( with the test matrix)?
There is button at the end of page. You can use it to attach file.
Thanks
Ying
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Find a compilable program below. However, I found that the issue might be a memory leak in DSS solver routines. Compiling with "indefinite" or "positive definite" yields valid solutions when calling dss with appropriate matrices. But calling dss in a loop, e.g. 100000 times (see the code), will lead to stuffing up the ram. With the example below and 8GB of ram, dss ram use had increased to ~50% (recorded with "top") when reaching the 100000th iteration. This happens with both positive definite and negative definite matrices.
include "mkl_dss.f90" Module Data_Kind Implicit None Integer, Parameter :: IkXL=Selected_Int_Kind(12) Integer, Parameter :: IkL=Selected_Int_Kind(8) Integer, Parameter :: IkM=Selected_Int_Kind(4) Integer, Parameter :: IkS=Selected_Int_Kind(2) Integer(IkS), Parameter :: RkDbl=Selected_Real_Kind(15,100) Integer(IkS), Parameter :: RkSgl=Selected_Real_Kind(6,37) End Module Data_Kind Module ModSparseSquaredUpperTriangularMatrix use Data_Kind Implicit None Type :: SparseSquaredUpperTriangularMatrix Integer(IkXL) :: ISDim=0_ikxl Integer(IkL), allocatable, Dimension(:) :: IVColPos, IVRowPos Real(Rkdbl), allocatable, Dimension(:) :: RVCoeff End type SparseSquaredUpperTriangularMatrix End Module ModSparseSquaredUpperTriangularMatrix Module ModEquation use Data_Kind use ModSparseSquaredUpperTriangularMatrix Implicit None Type :: Equation Real(Rkdbl), Pointer, Dimension(:) :: RVSol, RVRhs Type(SparseSquaredUpperTriangularMatrix), Pointer :: TSLhs End type Equation End Module ModEquation Module ModMKLSolver use Data_Kind use ModEquation Implicit none Type MKLSolver Type(Equation) :: TSEq contains Procedure, Pass, Public :: Solve => SubSetPEVDSS End type MKLSolver Private :: SubSetPEVDSS contains Subroutine SubSetPEVDSS(this,ISSubStat) use MKL_DSS Implicit None Class(MKLSolver), Target, Intent(InOut) :: this Integer(Iks), Intent(InOut) :: ISSubStat TYPE(MKL_DSS_HANDLE) :: handle Integer(Ikxl) :: ISError Integer(Ikl) :: opt, a, ISSize Integer(Ikl), Allocatable, Dimension(:) :: IVPermu ISSize=this%TSEq%TSLHS%ISDim Allocate(& &IVPermu(ISSize),& &stat=ISSubStat) If(ISSubStat==0) Then IVPermu=0 this%TSEq%RVsol=0._rkdbl ISSubStat=dss_create(handle, MKL_DSS_MSG_LVL_WARNING& &+MKL_DSS_TERM_LVL_ERROR) If(ISSubStat==0) Then ISSubStat=dss_define_structure(handle=handle,& &opt=MKL_DSS_SYMMETRIC,& &rowIndex=this%TSEq%TSLhs%IVRowPos,& &nRows=ISSize,& &RCols=ISSize,& &columns=this%TSEq%TSLhs%IVColPos,& &nNonZeros=size(this%TSEq%TSLhs%RVCoeff)) End If If(ISSubStat==0) Then ISSubStat=dss_reorder(handle=handle, opt=MKL_DSS_GET_ORDER, perm& &=IVPermu) end If If(ISSubStat==0) Then ISSubStat=dss_factor(handle=handle,& &opt=MKL_DSS_POSITIVE_DEFINITE,& !&opt=MKL_DSS_INDEFINITE,& &RValues=this%TSEq%TSLhs%RVCoeff) End If If(ISSubStat==0) Then ISSubStat=dss_solve(handle=handle,& &opt=0,& &RRhsValues=this%TSEq%RVRHS,& &nRhs=1,& &RSolValues=this%TSEq%RVSol) End If End If end Subroutine SubSetPEVDSS end Module ModMKLSolver Program DSS_Test use Data_Kind use ModMKLSolver use ModSparseSquaredUpperTriangularMatrix Implicit None Integer(Iks) :: ISSubstat Real(Rkdbl) :: RMLhsPD(4,4) Real(Rkdbl), Target :: RVRhs(4), RVSol(4) Type(SparseSquaredUpperTriangularMatrix), Target :: TSLhsPD Type(MKLSolver) :: TSSolver Integer(IkXL) :: c1 !!set the full matrices (for fun) RMLhsPD=reshape((/5.2800,13.8366,16.6227,0.0000,& &13.8366,74.0000,84.8594,0.0000,& &16.6227,84.8594,173.0000,0.0000,& &0.0000,0.0000,0.0000,60.0000/),shape(RMLhsPD)) RVRhs=(/1,0,0,0/) !!set the right hand side !!set the sparse upper triangular matrices Allocate(TSLhsPD%IVColPos(7),TSLhsPD%RVCoeff(7),TSLhsPD%IVRowPos(5)) TSLhsPD%ISDim=4 TSLhsPd%IVColPos=(/1,2,3,2,3,3,4/) TSLhsPd%RVCoeff=(/5.2800,13.8366,16.6227,74.0000,84.8594,173.0000& &,60.0000/) TSLhsPD%IVRowPos=(/1,4,6,7,8/) !!solve TSSolver%TSEq%TSLhs => TSLhsPd TSSolver%TSEq%RVRhs => RVRhs TSSolver%TSEq%RVSol => RVSol Do c1=1,100000 call TSSolver%Solve(ISSubStat) End Do End Program DSS_Test
Below the makefile used to compile the program
FC =ifort -mkl -warn nounused -warn declarations -static -O3 -parallel SRC := MKLPATH=$(MKLROOT)/lib/intel64/ MKLINCLUDE=$(MKLPATH)/include/ MKL= -L$(MKLPATH) -I$(MKLINCLUDE) -lmkl_blas95_lp64 -lmkl_lapack95_lp64 -Wl,--start-group $(MKLPATH)/libmkl_intel_lp64.a $(MKLPATH)/libmkl_intel_thread.a $(MKLPATH)/libmkl_core.a -Wl,--end-group -liomp5 -lpthread .SUFFIXES: .SUFFIXES: .f90 include Main.mk OBJS = $(subst .f90,.o,$(SRC)) %.o: %.f90 $(FC) -c -o $@ $< DSS: $(OBJS) $(FC) -o $@ $^ $(MKL) clean: rm *.mod rm *.o
Thanks for the support.
Cheers
Karl
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Solved!!
I forgot the dss_delete.
Cheers
Karl
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page