First cut not the deepest?
Jim White
mathimagics at yahoo.co.uk
Fri Mar 23 07:36:31 CET 2007
Does Windows cause brain damage?
Runnng timing comparisons under Windows is always a
trifle dodgy, but the anomaly I am seeing is
particularly baffling.
The test is simple enough. Repeat some non-trivial
operation R times, report the time taken. Do that that
N times.
Using either a static or shared library built for a
Pentium 4 under MinGW, I am consistently getting a
series of times that increase fairly quickly, then
seem to stabilise at just under twice the time taken
for the first set.
For example, here the test program is mpz_mul-ing two
arguments of about 8K limbs, 1000 times a set:
> test -p 8192 -r 1000 -n 10
16:48:38 start test, ops/set = 1000, nreps = 10
16:48:47 time = 8.625000
16:48:58 time = 11.672000
16:49:11 time = 12.734000
16:49:24 time = 13.282000
16:49:38 time = 13.734000
16:49:52 time = 14.109000
16:50:06 time = 14.250000
16:50:21 time = 14.453000
16:50:35 time = 14.500000
16:50:50 time = 14.579000
16:50:50 avg = 13.193800
The test program records the real-time clock as well
as the calculated times, because I had to convince
myself that the calculated times were right!
This same trend is produced, regardless of whether I
hammer mpz_mul, or mpf_div, or mpfr_cos.
Has my obtuseness become acute (so to speak!), or is
there something going on in there?
Cheers
Jim White
ANU, Canberra
-------------------------------------------
> type test.c
#include <stdio.h>
#include <time.h>
#include "gmp_static.h"
mpz_t X1, X2, Y;
int TSTART, TNOW;
double GetClock() {return ((double)(TNOW -
TSTART)/1000.0);}
char timenow[32];
char *dclock() { // time-of-day ("hh:mm:ss")
time_t etime; time(&etime);
char *tnow = (char *) ctime(&etime);
strncpy (timenow, tnow, 20);
timenow[20] = 0;
return (&timenow[11]);
}
//----------------------
int main (int argc, char *argv[]) {
int i, p;
int k = 1;
int r = 1000;
int nreps = 1;
while (k < argc) {
if (strcmp(argv[k],"-p") == 0) { k++; p =
atoi(argv[k]); }
if (strcmp(argv[k],"-r") == 0) { k++; r =
atoi(argv[k]); }
if (strcmp(argv[k],"-n") == 0) { k++; nreps =
atoi(argv[k]); }
k++;
}
mpz_init2 (X1, 32*p);
mpz_init2 (X2, 32*p);
mpz_init2 (Y, 32*p);
double xtime, rtime;
// Set test operands
mpz_set_ui (X1, 3); mpz_set_ui (X2, 3);
while (X1->_mp_size < (p/2)) {
mpz_add_ui (X2, X2, 2);
mpz_mul (X1, X1, X2);
}
mpz_mul (X2, X1, X1);
mpz_add_ui (X1, X1, 1);
// Timing tests
rtime = 0.0;
printf ("%s start test, ops/set = %d, nreps =
%d\n", dclock(), r, nreps);
for (k = 0; k < nreps; k++) {
TSTART = clock();
for (i=0; i < r; i++) mpz_mul (Y, X1, X2);
TNOW = clock();
xtime = GetClock();
rtime += xtime;
printf ("%s time = %f\n", dclock(), xtime);
}
rtime /= nreps;
printf ("%s avg = %f\n", dclock(), rtime);
}
More information about the gmp-discuss
mailing list