From a2996ed5d9dfdbc7287e161d894605c19738b7a6 Mon Sep 17 00:00:00 2001 From: Matt Pharr Date: Wed, 3 Aug 2011 14:28:06 +0100 Subject: [PATCH] More efficient implementation of frandom() in stdlib --- stdlib.ispc | 4 +++- tests/rand-distrib-1.ispc | 27 +++++++++++++++++++++++++++ tests/rand-distrib.ispc | 17 +++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 tests/rand-distrib-1.ispc create mode 100644 tests/rand-distrib.ispc diff --git a/stdlib.ispc b/stdlib.ispc index 2b8dc582..9e63c566 100644 --- a/stdlib.ispc +++ b/stdlib.ispc @@ -2624,7 +2624,9 @@ static inline unsigned int random(reference RNGState state) static inline float frandom(reference RNGState state) { - return ((int)(random(state) & ((1<<24)-1))) / (float)(1 << 24); + unsigned int irand = random(state); + irand &= (1<<23)-1; + return floatbits(0x3F800000 | irand)-1.0f; } static inline uniform unsigned int __seed4(reference RNGState state, diff --git a/tests/rand-distrib-1.ispc b/tests/rand-distrib-1.ispc new file mode 100644 index 00000000..63be8c40 --- /dev/null +++ b/tests/rand-distrib-1.ispc @@ -0,0 +1,27 @@ + +export uniform int width() { return programCount; } + +export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) { + RNGState state; + seed_rng(state, 1); + int count[32]; + for (uniform int i = 0; i < 32; ++i) + count[i] = (b == 5.) ? 0 : 1; + uniform int iters = 10000; + for (uniform int i = 0; i < iters; ++i) { + unsigned int val = random(state); + for (uniform int j = 0; j < 32; ++j) { + if (val & (1< 0.495 * iters && count[i] < 0.505 * iters); + RET[programIndex] = ok ? 1 : 0; +} + +export void result(uniform float RET[]) { + RET[programIndex] = 1; +} diff --git a/tests/rand-distrib.ispc b/tests/rand-distrib.ispc new file mode 100644 index 00000000..8188a01c --- /dev/null +++ b/tests/rand-distrib.ispc @@ -0,0 +1,17 @@ + +export uniform int width() { return programCount; } + +export void f_f(uniform float RET[], uniform float aFOO[]) { + RNGState state; + seed_rng(state, 1); + float sum = 0; + uniform int iters = 10000; + for (unsigned int i = 0; i < iters; ++i) + sum += frandom(state); + float avg = sum / iters; + RET[programIndex] = (avg > 0.495 && avg < 0.505) ? 1 : 0; +} + +export void result(uniform float RET[]) { + RET[programIndex] = 1; +}