Skip to content

Commit ff1e340

Browse files
author
sswathym
committed
Test-functionality enhancement PXPOTRF,PXPOTRS APIs
Enhanced the test-functionality of PXPOTRF and PXPOTRS APIs to support the updated input file for all types and added extreme-value testing. Signed-off-by: Sundari H <[email protected]> AMD-Internal: [CPUPL-5179], [CPUPL-5197], [CPUPL-5199], [CPUPL-5200] Change-Id: I3174a6dd52b2ada68136d0e9fc6af3176dc4ada9
1 parent 28f27a5 commit ff1e340

File tree

6 files changed

+631
-145
lines changed

6 files changed

+631
-145
lines changed

TESTING/EXT_TESTS/LLT.dat

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
'LLT.out' output file name (if any)
44
6 device out
55
'U' define Lower or Upper
6-
4 number of problems sizes
7-
4 10 17 13 23 31 57 values of N
6+
5 number of problems sizes
7+
4 -10 17 0 13 23 31 57 values of N
88
3 number of NB's
99
2 3 4 5 values of NB
1010
3 number of NRHS's
11-
1 3 9 28 values of NRHS
11+
1 3 -9 28 values of NRHS
1212
3 number of NBRHS's
1313
1 3 5 7 values of NBRHS
1414
4 number of process grids (ordered pairs P & Q)

TESTING/LIN/pclltdriver.f

Lines changed: 153 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ PROGRAM PCLLTDRIVER
6666
*
6767
* =====================================================================
6868
*
69+
use,intrinsic :: ieee_arithmetic
6970
* .. Parameters ..
7071
INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
7172
$ LLD_, MB_, M_, NB_, N_, RSRC_
@@ -137,6 +138,15 @@ PROGRAM PCLLTDRIVER
137138
* ..
138139
* .. Executable Statements ..
139140
*
141+
* Take command-line arguments if requested
142+
CHARACTER*80 arg
143+
INTEGER numArgs, count
144+
LOGICAL :: help_flag = .FALSE.
145+
LOGICAL :: EX_FLAG = .FALSE., RES_FLAG = .FALSE.
146+
INTEGER :: INF_PERCENT = 0
147+
INTEGER :: NAN_PERCENT = 0
148+
DOUBLE PRECISION :: X
149+
*
140150
* Get starting information
141151
*
142152
#ifdef DYNAMIC_WORK_MEM_ALLOC
@@ -150,6 +160,35 @@ PROGRAM PCLLTDRIVER
150160
$ NTESTS, NGRIDS, PVAL, NTESTS, QVAL, NTESTS,
151161
$ THRESH, EST, MEM, IAM, NPROCS )
152162
CHECK = ( THRESH.GE.0.0E+0 )
163+
164+
* Get the number of command-line arguments
165+
numArgs = command_argument_count()
166+
167+
* Process command-line arguments
168+
do count = 1, numArgs, 2
169+
call get_command_argument(count, arg)
170+
select case (arg)
171+
case ("-h", "--help")
172+
help_flag = .true.
173+
exit
174+
case ("-inf")
175+
call get_command_argument(count + 1, arg)
176+
read(arg, *) INF_PERCENT
177+
IF (INF_PERCENT .GT. 0) THEN
178+
EX_FLAG = .TRUE.
179+
END IF
180+
case ("-nan")
181+
call get_command_argument(count + 1, arg)
182+
read(arg, *) NAN_PERCENT
183+
IF (NAN_PERCENT .GT. 0) THEN
184+
EX_FLAG = .TRUE.
185+
END IF
186+
case default
187+
print *, "Invalid option: ", arg
188+
help_flag = .true.
189+
exit
190+
end select
191+
end do
153192
*
154193
* Print headings
155194
*
@@ -288,11 +327,20 @@ PROGRAM PCLLTDRIVER
288327
GO TO 30
289328
END IF
290329
#else
291-
* If N < 0 in LLT.dat file then DESCINIT API sets IERR( 1 ) = -2
292-
IF( N.LT.0 .AND. IERR( 1 ).EQ.-2 ) THEN
293-
* If DESCINIT is returning correct error code then
294-
* do nothing
330+
IF(N .LT. 0 .AND. (IERR(1) .EQ. -2 .OR.
331+
$ IERR(1) .EQ. -4 .OR. IERR(1) .EQ. -8 .OR.
332+
$ IERR(1) .EQ. -3 .OR. IERR(1) .EQ. -12 )) THEN
333+
* DESCINIT returns the correct error code,
334+
* -2, -3 incase of invalid M and N
335+
* -4, -8 or -12 incase of incorrect grid info
336+
* MAIN API can be validated.
337+
* Do NOTHING
295338
WRITE( NOUT, FMT = 9984 ) 'N'
339+
* disable extreme value case when N < 0
340+
EX_FLAG = .FALSE.
341+
ELSE IF(N .EQ. 0) THEN
342+
* disable extreme value case when M < 0
343+
EX_FLAG = .FALSE.
296344
ELSE IF( IERR( 1 ).LT.0 ) THEN
297345
IF( IAM.EQ.0 )
298346
$ WRITE( NOUT, FMT = 9997 ) 'descriptor'
@@ -370,7 +418,7 @@ PROGRAM PCLLTDRIVER
370418
*
371419
* Calculate inf-norm of A for residual error-checking
372420
*
373-
IF( CHECK ) THEN
421+
IF( CHECK .AND. N .GT. 0 ) THEN
374422
CALL PCFILLPAD( ICTXT, NP, NQ, MEM( IPA-IPREPAD ),
375423
$ DESCA( LLD_ ), IPREPAD, IPOSTPAD,
376424
$ PADVAL )
@@ -397,7 +445,7 @@ PROGRAM PCLLTDRIVER
397445
$ DESCA( LLD_ ), DESCA( RSRC_ ),
398446
$ DESCA( CSRC_ ), IASEED, 0, NP, 0, NQ,
399447
$ MYROW, MYCOL, NPROW, NPCOL )
400-
IF( CHECK )
448+
IF( CHECK .AND. N .GT. 0)
401449
$ CALL PCFILLPAD( ICTXT, NP, NQ,
402450
$ MEM( IPA0-IPREPAD ), DESCA( LLD_ ),
403451
$ IPREPAD, IPOSTPAD, PADVAL )
@@ -419,27 +467,29 @@ PROGRAM PCLLTDRIVER
419467
$ WRITE( NOUT, FMT = * ) 'PCPOTRF INFO=', INFO
420468
* If N < 0 in LLT.dat file then PCPOTRF API sets INFO = -2
421469
IF (N.LT.0 .AND. INFO.EQ.-2) THEN
422-
* If PCPOTRF is returning correct error
423-
* code we need to pass this case
470+
* If PDPOTRF is returning correct error code, do nothing
424471
WRITE( NOUT, FMT = 9983 ) 'PCPOTRF'
425-
KPASS = KPASS + 1
472+
ELSE IF (INFO.GT.0 .AND. EX_FLAG) THEN
473+
WRITE(*,*) 'PCPOTRF INFO=', INFO
474+
* do nothing, skip residual calculation
475+
* Pass this case in INF/NAN residual calculation
426476
ELSE
427477
* For other error code we will mark test case as fail
428478
KFAIL = KFAIL + 1
479+
RCOND = ZERO
480+
GO TO 60
429481
END IF
430-
RCOND = ZERO
431-
GO TO 60
432482
ELSE IF (N.EQ.0) THEN
433483
* If N = 0 this is the case of
434484
* early return from ScaLAPACK API.
435485
* If there is safe exit from API we need to pass this case
436486
WRITE( NOUT, FMT = 9982 ) 'PCPOTRF'
437-
KPASS = KPASS + 1
438487
RCOND = ZERO
439-
GO TO 60
440488
END IF
441489
*
442-
IF( CHECK ) THEN
490+
*
491+
IF( CHECK .AND. .NOT.(EX_FLAG) .AND. INFO.EQ.0 .AND.
492+
$ N .GT. 0) THEN
443493
*
444494
* Check for memory overwrite in LLt factorization
445495
*
@@ -481,7 +531,7 @@ PROGRAM PCLLTDRIVER
481531
GO TO 60
482532
END IF
483533
*
484-
IF( CHECK ) THEN
534+
IF( CHECK .AND. .NOT.(EX_FLAG) .AND. INFO .EQ. 0) THEN
485535
CALL PCFILLPAD( ICTXT, LWORK, 1,
486536
$ MEM( IPW-IPREPAD ), LWORK,
487537
$ IPREPAD, IPOSTPAD, PADVAL )
@@ -493,11 +543,15 @@ PROGRAM PCLLTDRIVER
493543
*
494544
* Compute condition number of the matrix
495545
*
496-
CALL PCPOCON( UPLO, N, MEM( IPA ), 1, 1, DESCA,
546+
547+
IF(.NOT.(EX_FLAG) .AND. N.GT.0 ) THEN
548+
CALL PCPOCON( UPLO, N, MEM( IPA ), 1, 1, DESCA,
497549
$ ANORM1, RCOND, MEM( IPW ), LWORK,
498550
$ MEM( IPW2 ), LRWORK, INFO )
551+
END IF
499552
*
500-
IF( CHECK ) THEN
553+
IF( CHECK .AND. .NOT.(EX_FLAG) .AND.
554+
$ N .GT. 0) THEN
501555
CALL PCCHEKPAD( ICTXT, 'PCPOCON', NP, NQ,
502556
$ MEM( IPA-IPREPAD ), DESCA( LLD_ ),
503557
$ IPREPAD, IPOSTPAD, PADVAL )
@@ -529,8 +583,9 @@ PROGRAM PCLLTDRIVER
529583
$ IERR( 1 ) )
530584
* If NRHS < 0 in LLT.dat file then
531585
* DESCINIT API sets IERR( 1 ) = -3
532-
IF (NRHS.LT.0 .AND. IERR( 1 ).EQ.-3 ) THEN
533-
* If DESCINIT is returning correct error code then
586+
IF (NRHS.LT.0 .AND. IERR( 1 ).EQ.-3 .OR.
587+
$ IERR(1) .EQ. -12) THEN
588+
* If DESCINIT is returns correct error code
534589
* do nothing
535590
WRITE( NOUT, FMT = 9984 ) 'NRHS'
536591
END IF
@@ -598,7 +653,7 @@ PROGRAM PCLLTDRIVER
598653
$ DESCB( CSRC_ ), IBSEED, 0, NP, 0,
599654
$ MYRHS, MYROW, MYCOL, NPROW, NPCOL )
600655
*
601-
IF( CHECK )
656+
IF( CHECK .AND. INFO .EQ. 0 )
602657
$ CALL PCFILLPAD( ICTXT, NP, MYRHS,
603658
$ MEM( IPB-IPREPAD ),
604659
$ DESCB( LLD_ ),
@@ -613,7 +668,8 @@ PROGRAM PCLLTDRIVER
613668
$ MYRHS, MYROW, MYCOL, NPROW,
614669
$ NPCOL )
615670
*
616-
IF( CHECK ) THEN
671+
IF( CHECK .AND. .NOT.(EX_FLAG) .AND.
672+
$ INFO .EQ. 0 ) THEN
617673
CALL PCFILLPAD( ICTXT, NP, MYRHS,
618674
$ MEM( IPB0-IPREPAD ),
619675
$ DESCB( LLD_ ), IPREPAD,
@@ -645,19 +701,24 @@ PROGRAM PCLLTDRIVER
645701
$ WRITE( NOUT, FMT = * ) 'PCPOTRS INFO=', INFO
646702
* If NRHS < 0 in LLT.dat file then
647703
* PCPOTRS API sets INFO = -3
648-
IF( NRHS.LT.0 .AND. INFO.EQ.-3 ) THEN
649-
* If PCPOTRS is returning correct error code then
704+
IF( NRHS.LT.0 .AND. INFO.EQ.-3 .OR.
705+
$ (N.LT.0 .AND. INFO.EQ.-2) ) THEN
706+
* If PDPOTRS is returning correct error code then
650707
* we need to pass this case
651708
WRITE( NOUT, FMT = 9983 ) 'PCPOTRS'
652-
KPASS = KPASS + 1
709+
ELSE IF( INFO .GT. 0 .AND. EX_FLAG) THEN
710+
WRITE(*,*) 'PCPOTRS INFO=', INFO
711+
* Do Nothing, Pass this case in residual calculation
653712
ELSE
654713
* For other error code we will mark test case as fail
655714
KFAIL = KFAIL + 1
715+
GO TO 60
656716
END IF
657-
GO TO 60
658717
END IF
659-
660-
IF( CHECK ) THEN
718+
*
719+
IF( CHECK .AND. .NOT.(EX_FLAG) .AND.
720+
$ INFO .EQ. 0 .AND. N .GT. 0 .AND.
721+
$ NRHS .GT. 0) THEN
661722
*
662723
* check for memory overwrite
663724
*
@@ -707,10 +768,64 @@ PROGRAM PCLLTDRIVER
707768
KFAIL = KFAIL + 1
708769
PASSED = 'FAILED'
709770
END IF
771+
ELSE
772+
IF( NRHS.LT.0 .AND. INFO.EQ.-3 .OR.
773+
$ (N.LT.0 .AND. INFO.EQ.-2) ) THEN
774+
* If PDGETRS is returning correct error code
775+
* we need to pass this case
776+
SRESID = SRESID - SRESID
777+
KPASS = KPASS + 1
778+
IF(NAN_PERCENT .GT. 0 .OR.
779+
$ INF_PERCENT .GT. 0) THEN
780+
* RESET EX-FLAG
781+
EX_FLAG = .TRUE.
782+
END IF
783+
ELSE IF( N .EQ. 0 .AND. INFO .EQ. 0 ) THEN
784+
* If PDGETRS is returning correct error code
785+
* we need to pass this case
786+
SRESID = SRESID - SRESID
787+
KPASS = KPASS + 1
788+
IF(NAN_PERCENT .GT. 0 .OR.
789+
$ INF_PERCENT .GT. 0) THEN
790+
* RESET EX-FLAG
791+
EX_FLAG = .TRUE.
792+
END IF
793+
* Extreme value validation check
794+
ELSE IF( EX_FLAG) THEN
795+
* Check presence of INF/NAN in output
796+
* Pass the case if present
797+
DO IK = 0, M
798+
DO JK = 1, N
799+
X = MEM(IK*N + JK)
800+
IF (isnan(X)) THEN
801+
* NAN DETECTED
802+
RES_FLAG = .TRUE.
803+
EXIT
804+
ELSE IF (.NOT.ieee_is_finite(
805+
$ X)) THEN
806+
* INFINITY DETECTED
807+
RES_FLAG = .TRUE.
808+
EXIT
809+
END IF
810+
END DO
811+
IF(RES_FLAG) THEN
812+
EXIT
813+
END IF
814+
END DO
815+
IF (.NOT.(RES_FLAG)) THEN
816+
KFAIL = KFAIL + 1
817+
PASSED = 'FAILED'
710818
ELSE
711819
KPASS = KPASS + 1
820+
PASSED = 'PASSED'
821+
* RESET RESIDUAL FLAG
822+
RES_FLAG = .FALSE.
823+
END IF
824+
ELSE
712825
SRESID = SRESID - SRESID
826+
KPASS = KPASS + 1
713827
PASSED = 'BYPASS'
828+
END IF
714829
END IF
715830
*
716831
IF( EST ) THEN
@@ -744,7 +859,8 @@ PROGRAM PCLLTDRIVER
744859
GO TO 10
745860
END IF
746861
*
747-
IF( CHECK ) THEN
862+
IF( CHECK .AND. .NOT.(EX_FLAG) .AND.
863+
$ INFO .EQ.0) THEN
748864
CALL PCFILLPAD( ICTXT, LWORK, 1,
749865
$ MEM( IPW-IPREPAD ),
750866
$ LWORK, IPREPAD, IPOSTPAD,
@@ -759,17 +875,21 @@ PROGRAM PCLLTDRIVER
759875
* Use iterative refinement to improve the
760876
* computed solution
761877
*
762-
CALL PCPORFS( UPLO, N, NRHS, MEM( IPA0 ),
878+
IF(INFO .EQ.0 .AND. .NOT.(EX_FLAG) ) THEN
879+
CALL PCPORFS( UPLO, N, NRHS, MEM( IPA0 ),
763880
$ 1, 1, DESCA, MEM( IPA ), 1, 1,
764881
$ DESCA, MEM( IPB0 ), 1, 1,
765882
$ DESCB, MEM( IPB ), 1, 1, DESCB,
766883
$ MEM( IPFERR ), MEM( IPBERR ),
767884
$ MEM( IPW ), LWORK, MEM( IPW2 ),
768885
$ LRWORK, INFO )
886+
END IF
769887
*
770888
* check for memory overwrite
771889
*
772-
IF( CHECK ) THEN
890+
IF( CHECK .AND. INFO .EQ.0 .AND.
891+
$ .NOT.(EX_FLAG) .AND.
892+
$ N .GT. 0 .AND. NRHS .GT. 0) THEN
773893
CALL PCCHEKPAD( ICTXT, 'PCPORFS', NP,
774894
$ NQ, MEM( IPA0-IPREPAD ),
775895
$ DESCA( LLD_ ), IPREPAD,
@@ -896,7 +1016,8 @@ PROGRAM PCLLTDRIVER
8961016
10 CONTINUE
8971017
20 END DO
8981018
*
899-
IF( CHECK .AND. SRESID.GT.THRESH ) THEN
1019+
IF( CHECK .AND. SRESID.GT.THRESH .AND. INFO .EQ.0 .AND.
1020+
$ .NOT.(EX_FLAG)) THEN
9001021
*
9011022
* Compute FRESID = ||A - LL'|| / (||A|| * N * eps)
9021023
*
@@ -977,7 +1098,7 @@ PROGRAM PCLLTDRIVER
9771098
9987 FORMAT( 'END OF TESTS.' )
9781099
9986 FORMAT( '||A - ', A4, '|| / (||A|| * N * eps) = ', G25.7 )
9791100
9985 FORMAT( '||Ax-b||/(||x||*||A||*eps*N) ', F25.7 )
980-
9984 FORMAT( A, ' < 0 case detected. ',
1101+
9984 FORMAT( A4, ' < 0 case detected. ',
9811102
$ 'Instead of driver file, we will handle this case from ',
9821103
$ 'ScaLAPACK API.')
9831104
9983 FORMAT( A, ' returned correct error code. Passing this case.')

0 commit comments

Comments
 (0)