grunwald@flute.cs.uiuc.edu (Dirk Grunwald) (07/26/89)
I modified your example slightly and tried it on a Sun-3/60 w/68881
running SunOS 4.0.3, using g++ 1.35.1+
I got the following results:
Floating Point Compiled by: Time
--------------------------------------------------------------------------
real f77 -O 84.7
real f77 -O4 85.4
double precision f77 -O4 88.1
float g++ -O -fstrength-reduce 85.5
double g++ -O -fstrength-reduce 95.9
double, global vars g++ -O -fstrength-reduce 95.3
double, no dope vector g++ -O -fstrength-reduce 97.3
Conclusions:
+ I can't wait to get a DEC-3100
+ G++ isn't so bad for numeric codes
+ G++/Gcc needs better optimization for `doubles'
+ G++ needs to improve optimization for induction variables
that are class member functions [posted to gnu.g++.bug]
Changes to the code & why:
+ g++ doesn't grok inlines if they're in the class defn, so I
pulled it out
+ G++ has dynamic local vectors, so you don't need the mallocs,
but you do need a macro [curse the language].
I think this saves MUCHO time. You could pull a similar trick
using ``alloca'' on a vanilla-flavoured C++ backend.
You could also make the variables be global, since FORTRAN
does that (no saving in of itself)
+ used inline math library (<math.h> includes <math-68881.h>)
//--------------- C++ header to handle arrays like fortran.
// by dave nichols, hack by d. grunwald
class Matrix {
private:
int *index;
double *data;
public:
Matrix( int n1, int n2, int *indx, double *dat);
double& operator()( int i, int j );
};
static inline double&
Matrix::operator()( int i, int j ) {
return ( data[i + index[j] ] );
}
static inline
Matrix::Matrix( int n1, int n2, int *indx, double *dat) {
index = indx;
data = dat;
for( int i =0; i<n2; i++ ) {
index[i] = i*n1;
}
}
#include <stdio.h>
#include <math.h>
#include <generic.h>
#define MATRIX(name,n1,n2)\
int name2(name,index)[n1];\
double name2(name,data)[n1*n2]; \
Matrix name(n1, n2, name2(name,index), name2(name,data));
main () {
int i, j, k;
double total=0.;
const int n=200;
MATRIX(x,n,n);
for( i=0; i<n; i++ )
for( j=0; j<n; j++ )
x(i,j) = sqrt(1.+(i+1)+(j+1));
for( i=0; i<n; i++ )
for( j=0; j<n; j++ )
for( k=0; k<n; k++ )
total = total + x(i,k) * x(k,j);
printf("total=%f\n 1576677724. if double precision\n",
(double) total );
}
--
Dirk Grunwald -- Univ. of Illinois (grunwald@flute.cs.uiuc.edu)