summaryrefslogtreecommitdiff
path: root/fpemulation.c
diff options
context:
space:
mode:
authorMatt Turner <mattst88@gmail.com>2008-11-14 03:19:19 +0000
committerMatt Turner <mattst88@gmail.com>2008-11-14 03:19:19 +0000
commitfac9b754c5c93f49c951fa157a3cb30b6fb05214 (patch)
tree60f3eb428f77d168604398935df25d96a902b5d8 /fpemulation.c
parentbecd1a927a0fa089a62b0cbc352cdbf224da7286 (diff)
-- Remove stopwatch functions from fourier.c and fpemulation.c and clean them
git-svn-id: svn://mattst88.com/svn/cleanbench/trunk@25 0d43b9a7-5ab2-4d7b-af9d-f64450cef757
Diffstat (limited to 'fpemulation.c')
-rw-r--r--fpemulation.c50
1 files changed, 18 insertions, 32 deletions
diff --git a/fpemulation.c b/fpemulation.c
index e851cd9..61b016b 100644
--- a/fpemulation.c
+++ b/fpemulation.c
@@ -4,6 +4,7 @@
#include <string.h>
#include <math.h>
#include <limits.h>
+#include <time.h>
#include "nmglobal.h"
#include "nbench1.h"
@@ -23,18 +24,14 @@
void
DoEmFloat(void)
{
- /* Error context string pointer */
- const char *errorcontext = "CPU:Floating Emulation";
- /* Local structure */
- EmFloatStruct *locemfloatstruct = &global_emfloatstruct;
-
- InternalFPF *abase = NULL; /* Base of A array */
- InternalFPF *bbase = NULL; /* Base of B array */
- InternalFPF *cbase = NULL; /* Base of C array */
- unsigned long accumtime; /* Accumulated time in ticks */
- double iterations; /* # of iterations */
- unsigned long tickcount; /* # of ticks */
- unsigned long loops; /* # of loops */
+ const char* errorcontext = "CPU:Floating Emulation";
+ EmFloatStruct* locemfloatstruct = &global_emfloatstruct;
+ InternalFPF* abase = NULL;
+ InternalFPF* bbase = NULL;
+ InternalFPF* cbase = NULL;
+ clock_t total_time = 0;
+ int iterations = 0;
+ unsigned long loops = 1;
abase = malloc(locemfloatstruct->arraysize * sizeof(InternalFPF));
if (!abase) {
@@ -61,7 +58,9 @@ DoEmFloat(void)
SetupCPUEmFloatArrays(abase, bbase, cbase, locemfloatstruct->arraysize); /* FIXME: ugly */
/* See if we need to do self-adjusting code.*/
- if (locemfloatstruct->adjust == 0) {
+ if (locemfloatstruct->adjust == FALSE) {
+ locemfloatstruct->adjust = TRUE;
+
locemfloatstruct->loops = 0;
/*
@@ -69,10 +68,8 @@ DoEmFloat(void)
** less than minimum, increase the loop count and try
** again.
*/
- for (loops = 1; loops < CPUEMFLOATLOOPMAX; loops += loops) {
- tickcount = DoEmFloatIteration(abase, bbase, cbase, /* FIXME: ugly */
- locemfloatstruct->arraysize, loops);
- if (tickcount > global_min_ticks) {
+ for (; loops < CPUEMFLOATLOOPMAX; loops += loops) {
+ if (DoEmFloatIteration(abase, bbase, cbase, locemfloatstruct->arraysize, loops) > global_min_ticks) {
locemfloatstruct->loops = loops;
break;
}
@@ -96,25 +93,14 @@ DoEmFloat(void)
** # of seconds requested.
** Each iteration performs arraysize * 3 operations.
*/
- accumtime = 0L;
- iterations = 0.0;
do {
- accumtime += DoEmFloatIteration(abase, bbase, cbase, /* FIXME: ugly */
- locemfloatstruct->arraysize, locemfloatstruct->loops);
- iterations += 1.0;
- } while (TicksToSecs(accumtime) < locemfloatstruct->request_secs);
+ total_time += DoEmFloatIteration(abase, bbase, cbase, locemfloatstruct->arraysize, locemfloatstruct->loops);
+ ++iterations;
+ } while (total_time < locemfloatstruct->request_secs * CLOCKS_PER_SEC);
- /*
- ** Clean up, calculate results, and go home.
- ** Also, indicate that adjustment is done.
- */
free(abase);
free(bbase);
free(cbase);
- locemfloatstruct->emflops = (iterations * (double)locemfloatstruct->loops)
- / (double)TicksToFracSecs(accumtime);
- if (locemfloatstruct->adjust == 0) {
- locemfloatstruct->adjust = 1;
- }
+ locemfloatstruct->emflops = (double)(iterations * locemfloatstruct->loops * CLOCKS_PER_SEC) / (double)total_time;
}