From: Chuck Ebbert <76306.1226@compuserve.com>
To: linux-kernel <linux-kernel@vger.kernel.org>
Subject: i387 floating-point test program/benchmark
Date: Fri, 29 Jul 2005 16:36:05 -0400 [thread overview]
Message-ID: <200507291639_MC3-1-A5E6-856D@compuserve.com> (raw)
/* fp.c: i387 benchmark/test program */
#define FP_VERSION "0.10"
#define _GNU_SOURCE
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <sched.h>
#define COND_YIELD(iters, ctr) \
if ((iters) > 0 && ++(ctr) > (iters)) { \
(ctr) = 0; \
sched_yield(); \
}
#define RDTSCLL(r) __asm__ __volatile__("rdtsc" : "=A" (r))
int fp = 0, in = 0, yi = 0;
volatile int lo = 0, lo2 = 0;
int p_ctr = 0, c_ctr = 0, get;
long long i, c_iters, p_iters = 0;
long double c_res, p_res;
unsigned long long tsc1, tsc2;
cpu_set_t cpuset;
static void handler(int sig)
{
lo = 0; /* child exited -- stop looping */
}
struct sigaction sa = {
.sa_handler = handler,
};
void usage(char *prog)
{
printf("\n i387 floating point benchmark/test program v" FP_VERSION);
printf("\n\n Usage:\n");
printf("\t%s [-f] [-i] [-a] [-y count] loops\n\n", prog);
printf("\t-f : loop in parent process waiting for child to exit\n");
printf("\t-i : do integer math while looping instead of FP math\n");
printf("\t (-f and -i: do one FP operation, then use integer math)\n");
printf("\t-a : run parent and child on single cpu\n");
printf("\t-y : yield CPU every 'count' loops in parent and child\n\n");
exit(1);
}
static void do_parent()
{
if (fp)
__asm__ __volatile__("fld1 ; fldz");
while (lo) {
if (fp & !in)
__asm__ __volatile__("fadd %st(1), %st(0)");
else
p_iters++;
COND_YIELD(yi, p_ctr);
}
if (fp)
__asm__ __volatile__("fxch ; fstpt p_res ; fstpt p_res");
if (fp & !in)
p_iters = (long long)p_res;
printf("Parent did: %12lld loops\n", p_iters);
}
static void do_child()
{
RDTSCLL(tsc1);
__asm__ __volatile__("fld1 ; fldz");
for (i = 0; i < c_iters; i++) {
__asm__ __volatile__("fadd %st(1), %st(0)");
COND_YIELD(yi, c_ctr);
}
__asm__ __volatile__("fxch ; fstpt c_res ; fstpt c_res");
RDTSCLL(tsc2);
if (c_res != (long double)c_iters)
printf("FP error! Result was %Lg; expected %lld\n", c_res, c_iters);
printf("CPU clocks: %12llu\n", tsc2 - tsc1);
}
int main(int argc, char * argv[])
{
do {
get = getopt(argc, argv, "fiay:");
switch (get) {
case 'f':
fp = 1;
break;
case 'i':
in = 1;
break;
case 'a':
memset(&cpuset, sizeof(cpuset), 0);
CPU_SET(1, &cpuset);
sched_setaffinity(0, &cpuset);
break;
case 'y':
yi = atoi(optarg);
if (yi == 0)
get = '?';
break;
default:
break;
}
} while (get != -1 && get != '?');
if (get == '?' || optind >= argc)
usage(argv[0]);
c_iters = atoll(argv[optind]);
if (fp | in) {
sigaction(SIGCHLD, &sa, NULL);
lo2 = lo = 1;
}
if (fork())
if (lo2)
do_parent();
else
wait(NULL);
else
do_child();
return 0;
}
next reply other threads:[~2005-07-29 20:43 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-07-29 20:36 Chuck Ebbert [this message]
2005-07-29 22:15 ` Dave Jones
2005-08-02 18:25 ` Bill Davidsen
2005-08-03 6:14 ` Jan Engelhardt
2005-07-30 0:15 ` Puneet Vyas
2005-07-30 0:32 ` Con Kolivas
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200507291639_MC3-1-A5E6-856D@compuserve.com \
--to=76306.1226@compuserve.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®