IDE: Microsoft parallel studio 2010 Complier: Intel Fortran Processor: Core i5-2400 x64(4 threads) MKL library version: 10.3 update 7
Problem type: real unsymmetric N = 2682 NNZ = 5574 (can be different during series calculation)
I tried to solve a series equations A*X = B and the matrix A is real unsymmetric but has the same sparsity pattern. I decided to solve the system first time using IPHASE = 13 and return the IPERM(N) (IPARM(5) = 2) for future use. In the following calls I set IPHASE = 23 to skip the symbolic factorization step by setting IPARM(5) = 1 to use the IPERM(N) stored at the first step. The parallel option is used.
However, I didn't see any improvement comparing with the solver I used before which is coming from the Fortran numerical recipe. I was wondering if there is anything inappropriate with the IPARM initialization?
MTYPE = 11 IPT(1:64) = 0 IPARM(1:64) = 0 IPARM(1) = 1 !USE VALUES SUPPLIED BY USER IPARM(2) = 3 !USE OPENMP VERSION OF NESTED ALGORITHM IPARM(5) = 2 !PARDISO RETURNS THE PERMUTATION VECTOR COMPUTED AT PHASE 1 IPARM(8) = 1 !INTERATIVE REFINEMENT STEP IPARM(10) = 13 !PIVOTING PERTURBATION IPARM(11) = 1 !SCALING IPARM(13) = 1 !IMPROVED ACCURACY USING NON-SYMMETRIC WEIGHTED MATCHING IPARM(18) = 1 !DISABLE REPORTING IPARM(19) = 1 !DO NOT REPORT MFLOPS IPARM(24) = 1 !PARALLE FACTORIZATION MAXFCT = 1 MNUM = 1 IERROR = 0 MSGLVL = 0
Any suggestions would be very appreciated.
This is the piece of code I am calling for solving the series A*X= B
IF(ISYS.EQ.1)THEN IPHASE = 13 C ..... NUMERICAL FACTORIATION AND SOLUTION ..... ELSE IPARM(5) = 1 !USE EXTERNAL PERMUTATION VECTOR IPHASE = 23 !NUMERICAL FACTORIZATION ENDIF CALL PARDISO(IPT,MAXFCT,MNUM,MTYPE,IPHASE,N,A,IRWM,ICLM, 1 IPERM,NRHS,IPARM,MSGLVL,RHS,X,IERROR) IF(IERROR.EQ.0)THEN ISYS = 2 ICNT = 0 ENDIF IF(IERROR.LT.0.AND.ICNT.LT.1)THEN ISYS = 1 ICNT = ICNT+1 IPARM(5) = 2
RETURN ENDIF IF(IERROR.LT.0.AND.ICNT.EQ.1)THEN WRITE(6,2200)IERROR,IMATX,ISYS WRITE(6,*)IERROR,IMATX,ISYS PAUSE STOP ENDIF 2200 FORMAT(' ERROR MESSAGE FROM PARLELSL',/,5X,'IFLAG',I5,2X,'IMATX', + I5,2X,'ISYS',I5)
I have to mention that the matrix A is in triplet format, I have to write a sorting subroutine to reorder the matrix every time to be CSR format. I don't know how to measure the cpu time spent on this sorting procedure.
SUBROUTINE COOCSR00(N,NZ,A,IRW,ICL,A2,IRWM,ICLM) IMPLICIT REAL*8(A-H,O-Z) DIMENSION A(*),IRW(*),ICL(*),IRWM(*),ICLM(*) DIMENSION A1(NZ),IRW1(NZ),ICL1(NZ),A2(NZ) C .... THIS SUBROUTINE IS USED TO CHANGE THE TRIPLET FORMAT TO COMPRESSED ROW FORMAT .... C .... COPY THE INITIAL INPUT DATA .... A1(1:NZ) = A(1:NZ) IRW1(1:NZ) = IRW(1:NZ) ICL1(1:NZ) = ICL(1:NZ) C .... SORT THE TRIPLET MATRIX BY COLUMN .... CALL ST_SORT_A(NZ,IRW1,ICL1,A1) C .... CONVER THE ST FORMAT TO CSR FORMAT CALL COOCSR01(N,NZ,A1,IRW1,ICL1,A2,ICLM,IRWM) RETURN END