SUBROUTINE P11 ( A, B, C, MODULUS, N, NUMSIZE ) c IMPLICIT NONE c #include "bench11.h" c INTEGER N, NUMSIZE C--CVS variable declaration TYPE CVS sequence character( 160 ) string integer stringend END TYPE CVS C--CVS initilaize variables TYPE( CVS ),save :: CVS_INFO = $ CVS("BMARKGRP $Date: 2005/01/10 20:46:00 $ $Revision: 1.2 $" // $ "$RCSfile: p11.F,v $ $Name: rel_5 $", 0) c c These are allocated in main M11 at max size, we resize here c MPLONG A ( NUMSIZE, N, N ) MPLONG B ( NUMSIZE, N, N ) MPLONG C ( NUMSIZE, N, N ) MPLONG MODULUS ( NUMSIZE ) c c Multiply into TEMPMP, accumulate sums in TEMPC c MPLONG TEMPMP ( 2*MAXNUMSIZE ) MPLONG TEMPC ( 2*MAXNUMSIZE ) c INTEGER I, J, K, ABCSIZE, TEMPSIZE, MATRIXSIZE c ABCSIZE = NUMSIZE - MPHL TEMPSIZE = 2*NUMSIZE - MPHL c c initialize C to hold product A*B c DO 10, I = 1, N DO 10, J = 1, N C(MPALLOC, I, J) = ABCSIZE #if (GMP32 == 0) C(MPSIZE, I, J) = 0 #endif #ifdef GMP C(MPPTR, I, J) = LOC( C(MPDATA, I, J) ) #endif 10 CONTINUE c TEMPMP(MPALLOC) = TEMPSIZE #if (GMP32 == 0) TEMPMP(MPSIZE) = 0 #endif TEMPC(MPALLOC) = TEMPSIZE #ifdef GMP TEMPMP(MPPTR) = LOC( TEMPMP(MPDATA) ) TEMPC(MPPTR) = LOC( TEMPC(MPDATA) ) #endif c c Do the matrix multiplication c DO I = 1, N DO J = 1, N c c zeroize TEMPC - accumulate sum during loop c #if (GMP32 == 0) TEMPC(MPSIZE) = 0 #else c erase upper 32 bits of dual-use word 1 TEMPC(MPALLOC) = IAND( TEMPC(MPALLOC), BITMASK32 ) #endif c DO K = 1, N CALL MPMULT ( TEMPMP, A(1,I,K), B(1,K,J) ) CALL MPADD ( TEMPC, TEMPMP, TEMPC ) END DO c CALL MPMOD ( TEMPC, TEMPC, MODULUS ) c #ifdef GMP CALL MPSET ( C(1,I,J), TEMPC ) #else C(MPSIZE, I,J) = TEMPC(MPSIZE) DO K = MPDATA, MPDATA + TEMPC(MPSIZE) - 1 C(K,I,J) = TEMPC(K) ENDDO #endif c END DO END DO c RETURN END