Przeglądaj źródła

test: add benchmark tests for trigonometry functions.

legacy
Sam Hocevar sam 13 lat temu
rodzic
commit
744f4ac98d
1 zmienionych plików z 90 dodań i 0 usunięć
  1. +90
    -0
      test/lol-bench.cpp

+ 90
- 0
test/lol-bench.cpp Wyświetl plik

@@ -14,23 +14,41 @@

#include <cstdio>

#if defined HAVE_FASTMATH_H
# include <fastmath.h>
#endif

#include "core.h"
#include "loldebug.h"

using namespace std;
using namespace lol;

static size_t const TRIG_TABLE_SIZE = 128 * 1024;
static size_t const TRIG_RUNS = 50;

static size_t const MATRIX_TABLE_SIZE = 64 * 1024;
static size_t const MATRIX_RUNS = 100;

static size_t const HALF_TABLE_SIZE = 1024 * 1024;
static size_t const HALF_RUNS = 50;

static void bench_trig(int mode);
static void bench_matrix(int mode);
static void bench_half(int mode);

int main(int argc, char **argv)
{
Log::Info("--------------------------\n");
Log::Info(" Trigonometry [-1e5, 1e5]\n");
Log::Info("--------------------------\n");
bench_trig(1);

Log::Info("------------------------\n");
Log::Info(" Trigonometry [-pi, pi]\n");
Log::Info("------------------------\n");
bench_trig(2);

Log::Info("----------------------------\n");
Log::Info(" Float matrices [-2.0, 2.0]\n");
Log::Info("----------------------------\n");
@@ -49,6 +67,78 @@ int main(int argc, char **argv)
return EXIT_SUCCESS;
}

static void bench_trig(int mode)
{
float result[5] = { 0.0f };
Timer timer;

/* Set up tables */
float *pf = new float[TRIG_TABLE_SIZE];
float *pf2 = new float[TRIG_TABLE_SIZE];

for (size_t run = 0; run < TRIG_RUNS; run++)
{
switch (mode)
{
case 1:
for (size_t i = 0; i < TRIG_TABLE_SIZE; i++)
pf[i] = RandF(-1e5f, 1e5f);
break;
case 2:
for (size_t i = 0; i < TRIG_TABLE_SIZE; i++)
pf[i] = RandF(-M_PI, M_PI);
break;
}

/* Sin */
timer.GetMs();
for (size_t i = 0; i < TRIG_TABLE_SIZE; i++)
pf2[i] = __builtin_sinf(pf[i]);
result[0] += timer.GetMs();

/* Fast sin */
timer.GetMs();
for (size_t i = 0; i < TRIG_TABLE_SIZE; i++)
#if defined HAVE_FASTMATH_H
pf2[i] = f_sinf(pf[i]);
#else
pf2[i] = sinf(pf[i]);
#endif
result[1] += timer.GetMs();

/* Lol sin */
timer.GetMs();
for (size_t i = 0; i < TRIG_TABLE_SIZE; i++)
pf2[i] = lol_sin(pf[i]);
result[2] += timer.GetMs();

/* Cos */
timer.GetMs();
for (size_t i = 0; i < TRIG_TABLE_SIZE; i++)
pf2[i] = __builtin_cosf(pf[i]);
result[3] += timer.GetMs();

/* Tan */
timer.GetMs();
for (size_t i = 0; i < TRIG_TABLE_SIZE; i++)
pf2[i] = __builtin_tanf(pf[i]);
result[4] += timer.GetMs();
}

delete[] pf;
delete[] pf2;

for (size_t i = 0; i < sizeof(result) / sizeof(*result); i++)
result[i] *= 1000000.0f / (TRIG_TABLE_SIZE * TRIG_RUNS);

Log::Info(" ns/elem\n");
Log::Info("float = sinf(float) %7.3f\n", result[0]);
Log::Info("float = fastsinf(float) %7.3f\n", result[1]);
Log::Info("float = lol_sinf(float) %7.3f\n", result[2]);
Log::Info("float = cosf(float) %7.3f\n", result[3]);
Log::Info("float = tanf(float) %7.3f\n", result[4]);
}

static void bench_matrix(int mode)
{
float result[5] = { 0.0f };


Ładowanie…
Anuluj
Zapisz