Dear Denis, On Sat, Feb 27, 2010 at 09:22:53PM +0100, Denis Barbier wrote: > > This was fantastic analysis. I actually would like to know how you > > zeroed in onto zdrot to find the problem. > > Hi, > > I used brute force ;) > libblas3gf 1.2-4 is installed on my system, object files from > libblas3gf 1.2-3 have been unpacked into dir1, half files are moved > into dir2. then I compiled > gfortran zgesvd_ex.o dir1/*.o -llapack > and by dichotomy found which object file is causing trouble.
Thanks for letting me know; I shall try to use this method the next time. > > I shall now try to play around with zdrot to see if I can create a > > test case which reproduces the bug, so that I can file a bug report > > with GCC. > > I am afraid that this is not easy, and anyway GCC folks will discard > your bugreport since this bug has been fixed in 4.5. But I am very > interested to know the exact reason, and if there is a way to prevent > this bug by modifying source files. I have been trying, but I am unable to produce errors with my analysis of zdrot individually. In the hope that someone else smarter than me, can find a non-functional test case, I attach my source code. Compiling it with make, and then make FFLAGS=-O3 should result in some difference when the resulting executable is run for some test cases, but which test case it is, I am unsure. HTH, and thanks. Kumar -- Life's errors cry for the merciful beauty that can modulate their isolation into a harmony with the whole. - Rabindranath Tagore (Fireflies, 1928)
CFLAGS ?= -O2 FFLAGS ?= -O2 all: zdrot_test zdrot_test: zdrot.o zdrot_test.o zdrot.o: zdrot.f gfortran -c $(FFLAGS) $< -o $@ zdrot_test.o: zdrot_test.c $(CC) -c $(CFLAGS) $< -o $@ .PHONY: clean clean: $(RM) zdrot_test.o zdrot.o zdrot_test
SUBROUTINE ZDROT( N, CX, INCX, CY, INCY, C, S ) * * .. Scalar Arguments .. INTEGER INCX, INCY, N DOUBLE PRECISION C, S * .. * .. Array Arguments .. COMPLEX*16 CX( * ), CY( * ) * .. * * Purpose * ======= * * Applies a plane rotation, where the cos and sin (c and s) are real * and the vectors cx and cy are complex. * jack dongarra, linpack, 3/11/78. * * Arguments * ========== * * N (input) INTEGER * On entry, N specifies the order of the vectors cx and cy. * N must be at least zero. * Unchanged on exit. * * CX (input) COMPLEX*16 array, dimension at least * ( 1 + ( N - 1 )*abs( INCX ) ). * Before entry, the incremented array CX must contain the n * element vector cx. On exit, CX is overwritten by the updated * vector cx. * * INCX (input) INTEGER * On entry, INCX specifies the increment for the elements of * CX. INCX must not be zero. * Unchanged on exit. * * CY (input) COMPLEX*16 array, dimension at least * ( 1 + ( N - 1 )*abs( INCY ) ). * Before entry, the incremented array CY must contain the n * element vector cy. On exit, CY is overwritten by the updated * vector cy. * * INCY (input) INTEGER * On entry, INCY specifies the increment for the elements of * CY. INCY must not be zero. * Unchanged on exit. * * C (input) DOUBLE PRECISION * On entry, C specifies the cosine, cos. * Unchanged on exit. * * S (input) DOUBLE PRECISION * On entry, S specifies the sine, sin. * Unchanged on exit. * * ===================================================================== * * .. Local Scalars .. INTEGER I, IX, IY COMPLEX*16 CTEMP * .. * .. Executable Statements .. * IF( N.LE.0 ) $ RETURN IF( INCX.EQ.1 .AND. INCY.EQ.1 ) $ GO TO 20 * * code for unequal increments or equal increments not equal * to 1 * IX = 1 IY = 1 IF( INCX.LT.0 ) $ IX = ( -N+1 )*INCX + 1 IF( INCY.LT.0 ) $ IY = ( -N+1 )*INCY + 1 DO 10 I = 1, N CTEMP = C*CX( IX ) + S*CY( IY ) CY( IY ) = C*CY( IY ) - S*CX( IX ) CX( IX ) = CTEMP IX = IX + INCX IY = IY + INCY 10 CONTINUE RETURN * * code for both increments equal to 1 * 20 CONTINUE DO 30 I = 1, N CTEMP = C*CX( I ) + S*CY( I ) CY( I ) = C*CY( I ) - S*CX( I ) CX( I ) = CTEMP 30 CONTINUE RETURN END
#include <stdio.h> #include <math.h> typedef struct _dcomplex { double real; double imag; } dcomplex; int zdrot_(int *N, dcomplex *CX, int *INCX, dcomplex *CY,int *INCY, double *C, double *S); int main(void) { int i; int n = 5; dcomplex cx[] = {{1.0, 1.0}, {2.0, 2.0}, {3.0, 3.0}, {4.0, 4.0}, {5.0, 5.0}, {1.0, 1.0}, {2.0, 2.0}, {3.0, 3.0}, {4.0, 4.0}}; int incx = 2; dcomplex cy[] = {{-5.0, 5.0}, {0.0, 0.0}, {-4.0, 4.0}, {0.0, 0.0}, {-3.0, 3.0}, {0.0, 0.0}, {-2.0, 2.0}, {0.0, 0.0}, {-1.0, 1.0}}; int incy = -2; double c = 0.5; double s = sqrt(3.0) / 2.0; zdrot_(&n, cx, &incx, cy, &incy, &c, &s); printf("x: {"); for (i = 0; i < n - 1; ++i) { printf("(%.4f, %.4f), ", cx[2 * i].real, cx[2 * i].imag); } printf("(%.4f, %.4f)}\n", cx[2 * (n - 1)].real, cx[2 * (n - 1)].imag); printf("y: {"); for (i = 0; i < n - 1; ++i) { printf("(%.4f, %.4f), ", cy[2 * i].real, cy[2 * i].imag); } printf("(%.4f, %.4f)}\n", cy[2 * (n - 1)].real, cy[2 * (n - 1)].imag); return 0; }
signature.asc
Description: Digital signature