So first I see that some people are browsing the archive of
the mailing list scalapackers, great.
Should the test driver be corrected as well?
Yes, the tester needed to be corrected as well and it has been. The LIWORK
(size of IWORK) of the tester was set accordlingly to the documentation of
PDGETRI and we have observed that this size was too small. So PDGETRI
requires for a larger size for LIWORK.
The routine checks in entry that LIWORK is big enough. So the routine
PDGETRI returns an error message to the old tester. I have increased
LIWORK the size of the workspace IWORK given by pdinvdriver to match the
one of the new PDGETRI.
So it seems that the incorrect LIWORK problem is not caught by the test
driver, even though pdinvdriver.f checks if arrays are overwritten. It
seems that this check is not done properly since PDGETRI passes the
test, but fails otherwise in another application.
You are right.
Before calling PDGETRI, the tester PDINVDRIVER pads the workspace IWORK
(in MEM( IPIW )) from the left and the right with the value PADVAL =
9923.0D+0. In output it checks that this value is still there after the
run. This kind of guarantee that PDGETRI just uses the space it was given.
I do not understand why the tester was not detecting that PDGETRI is
writing in the memory space after IWORK ... That's a good point. Hope
somebody will ahve a look into this.
Julien.
On Wed, 24 May 2006, Francois Gygi wrote:
Hello,
I have encountered the same problem that Desheng Wang reported with
PDGETRI about the incorrectly computed LIWORK value (Thank you for the fix).
I think this may point to a problem in the test driver program
TESTING/LIN/pdinvdriver.f.
I have run the "xdinv" test program with the "INV.dat" input file
enclosed below. The test ran without problem (see output below).
However, when using PDGETRI with the same parameters in another code,
after getting the value of LIWORK by making a first call with LIWORK=1,
it crashed (segfault) in PDLAPIV (caused presumably by the problem of
the incorrect computed LIWORK value) when using the 2x1 process grid.
So it seems that the incorrect LIWORK problem is not caught by the test
driver, even though pdinvdriver.f checks if arrays are overwritten. It
seems that this check is not done properly since PDGETRI passes the
test, but fails otherwise in another application.
Should the test driver be corrected as well?
Thanks for your help.
Francois
======================================
INV.dat
======================================
'ScaLAPACK, Version 1.0, Matrix Inversion Testing input file'
'MPI machine.'
'INV.out' output file name (if any)
6 device out
5 number of matrix types (next line)
'GEN' 'UTR' 'LTR' 'UPD' 'LPD' GEN, UTR, LTR, UPD, LPD
1 number of problems sizes
1024 2 5 10 15 13 20 30 50 values of N
1 number of NB's
128 2 3 4 5 6 20 values of NB
3 number of process grids (ordered P & Q)
1 2 1 4 2 3 8 values of P
1 1 2 1 3 2 1 values of Q
1.0 threshold
===============================
Output of xdinv
===============================
SCALAPACK Matrix Inversion routines.
'MPI machine.'
Tests of the parallel real double precision Matrix Inversion routines.
The following scaled residual checks will be computed:
Inverse residual = inv(A)*A  I / (A * eps * N)
The matrix A is randomly generated for each test.
An explanation of the input/output parameters follows:
TIME : Indicates whether WALL or CPU time was used.
N : The number of rows and columns of the matrix A.
NB : The size of the square blocks the matrix A is split into.
P : The number of process rows.
Q : The number of process columns.
THRESH : If a residual value is less than THRESH, CHECK is flagged as
PASSED.
Fct time : Time in seconds to factor the matrix, if needed.
Inv Time : Time in seconds to inverse the matrix.
MFLOPS : Rate of execution for factor and inverse.
The following parameter values will be used:
N : 1024
NB : 128
P : 1 2 1
Q : 1 1 2
Relative machine precision (eps) is taken to be 0.111022E15
Routines pass computational tests if scaled residual is less than 1.0000
A is a general matrix.
TIME N NB P Q Fct Time Inv Time MFLOPS Cond
Resid CHECK
         

WALL 1024 128 1 1 2.26 4.71 307.93 2.3 0.00
PASSED
WALL 1024 128 2 1 2.79 4.61 290.05 2.3 0.00
PASSED
WALL 1024 128 1 2 2.56 8.43 195.15 2.3 0.00
PASSED
A is an upper triangular matrix.
TIME N NB P Q Fct Time Inv Time MFLOPS Cond
Resid CHECK
         

WALL 1024 128 1 1 0.00 1.18 304.41 2.3 0.00
PASSED
WALL 1024 128 2 1 0.00 1.19 301.40 2.3 0.00
PASSED
WALL 1024 128 1 2 0.00 1.51 236.76 2.3 0.00
PASSED
A is a lower triangular matrix.
TIME N NB P Q Fct Time Inv Time MFLOPS Cond
Resid CHECK
         

WALL 1024 128 1 1 0.00 1.23 291.80 2.3 0.00
PASSED
WALL 1024 128 2 1 0.00 1.23 291.80 2.3 0.00
PASSED
WALL 1024 128 1 2 0.00 0.95 375.52 2.3 0.00
PASSED
A is a symmetric positive definite matrix.
Only the upper triangular part will be referenced.
TIME N NB P Q Fct Time Inv Time MFLOPS Cond
Resid CHECK
         

WALL 1024 128 1 1 0.95 2.39 322.56 2.3 0.00
PASSED
WALL 1024 128 2 1 0.77 1.49 476.03 2.3 0.00
PASSED
WALL 1024 128 1 2 1.30 3.09 244.57 2.3 0.00
PASSED
A is a symmetric positive definite matrix.
Only the lower triangular part will be referenced.
TIME N NB P Q Fct Time Inv Time MFLOPS Cond
Resid CHECK
         

WALL 1024 128 1 1 1.25 2.22 309.50 2.3 0.00
PASSED
WALL 1024 128 2 1 1.49 2.42 274.87 2.3 0.00
PASSED
WALL 1024 128 1 2 1.45 3.60 212.96 2.3 0.00
PASSED
Finished 15 tests, with the following results:
15 tests completed and passed residual checks.
0 tests completed and failed residual checks.
0 tests skipped because of illegal input values.
END OF TESTS.
