|
|
@@ -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 }; |
|
|
|