[gegl/soc-2013-opecl-ops] Changed data types in cl-random producing differences with gegl-random
- From: Carlos Zubieta <czubieta src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl/soc-2013-opecl-ops] Changed data types in cl-random producing differences with gegl-random
- Date: Wed, 11 Sep 2013 12:24:39 +0000 (UTC)
commit 26fefe9d09a6c0ddb286c8b0c33a466090da0e82
Author: Carlos Zubieta <czubieta dev gmail com>
Date: Mon Sep 9 18:16:45 2013 -0500
Changed data types in cl-random producing differences with gegl-random
opencl/random.cl | 36 ++++++++++++++----------
opencl/random.cl.h | 74 ++++++++++++++++++++++++++++------------------------
2 files changed, 61 insertions(+), 49 deletions(-)
---
diff --git a/opencl/random.cl b/opencl/random.cl
index 86b4b3b..4b77774 100644
--- a/opencl/random.cl
+++ b/opencl/random.cl
@@ -22,9 +22,9 @@
#define NPRIME 101111
#define RANDOM_DATA_SIZE (15083+15091+15101)
-#define PRIME_SIZE 533
+#define PRIME_SIZE 533u
-static inline int
+static inline uint
_gegl_cl_random_int (__global const int *cl_random_data,
__global const long *cl_random_primes,
int seed,
@@ -40,16 +40,16 @@ _gegl_cl_random_int (__global const int *cl_random_data,
/* 3 rounds gives a reasonably high cycle for */
/* our synthesized larger random set. */
unsigned long seed_idx = seed % (PRIME_SIZE - 1 - ROUNDS);
- int prime0 = convert_int(cl_random_primes[seed_idx]),
- prime1 = convert_int(cl_random_primes[seed_idx+1]),
- prime2 = convert_int(cl_random_primes[seed_idx+2]);
+ int prime0 = cl_random_primes[seed_idx],
+ prime1 = cl_random_primes[seed_idx+1],
+ prime2 = cl_random_primes[seed_idx+2];
int r0 = cl_random_data[idx % prime0],
r1 = cl_random_data[prime0 + (idx % (prime1))],
r2 = cl_random_data[prime0 + prime1 + (idx % (prime2))];
return r0 ^ r1 ^ r2;
}
-int
+uint
gegl_cl_random_int (__global const int *cl_random_data,
__global const long *cl_random_primes,
int seed,
@@ -73,8 +73,8 @@ gegl_cl_random_int_range (__global const int *cl_random_data,
int min,
int max)
{
- int ret = _gegl_cl_random_int (cl_random_data, cl_random_primes,
- seed, x, y, z, n);
+ uint ret = _gegl_cl_random_int (cl_random_data, cl_random_primes,
+ seed, x, y, z, n);
return (ret % (max-min)) + min;
}
@@ -109,12 +109,18 @@ gegl_cl_random_int4_range (__global const int *cl_random_data,
int min,
int max)
{
- int4 ret = gegl_cl_random_int4 (cl_random_data, cl_random_primes,
- seed, x, y, z, n);
- return (ret % (max-min)) + min;
+ int r0 = gegl_cl_random_int_range(cl_random_data, cl_random_primes,
+ seed, x, y, z, n, min, max);
+ int r1 = gegl_cl_random_int_range(cl_random_data, cl_random_primes,
+ seed, x, y, z, n+1, min, max);
+ int r2 = gegl_cl_random_int_range(cl_random_data, cl_random_primes,
+ seed, x, y, z, n+2, min, max);
+ int r3 = gegl_cl_random_int_range(cl_random_data, cl_random_primes,
+ seed, x, y, z, n+3, min, max);
+ return (int4)(r0,r1,r2,r3);
}
-#define G_RAND_FLOAT_TRANSFORM 0.00001525902189669642175f
+#define G_RAND_FLOAT_TRANSFORM 0.00001525902189669642175
float
gegl_cl_random_float (__global const int *cl_random_data,
@@ -125,9 +131,9 @@ gegl_cl_random_float (__global const int *cl_random_data,
int z,
int n)
{
- int u = _gegl_cl_random_int (cl_random_data, cl_random_primes,
- seed, x, y, z, n);
- return convert_float(u & 0xffff) * G_RAND_FLOAT_TRANSFORM;
+ uint u = _gegl_cl_random_int (cl_random_data, cl_random_primes,
+ seed, x, y, z, n);
+ return (u & 0xffff) * G_RAND_FLOAT_TRANSFORM;
}
float
diff --git a/opencl/random.cl.h b/opencl/random.cl.h
index d5b651d..1a5b946 100644
--- a/opencl/random.cl.h
+++ b/opencl/random.cl.h
@@ -1,31 +1,31 @@
+/* This file is part of GEGL
+ *
+ * GEGL is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * GEGL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GEGL; if not, see <http://www.gnu.org/licenses/>.
+ *
+ * Copyright 2013 Carlos Zubieta (czubieta dev gmail com)
+ */
+
+/* XXX: this file should be kept in sync with gegl-random. */
static const char* cl_random_source =
-"/* This file is part of GEGL \n"
-" * \n"
-" * GEGL is free software; you can redistribute it and/or \n"
-" * modify it under the terms of the GNU Lesser General Public \n"
-" * License as published by the Free Software Foundation; either \n"
-" * version 3 of the License, or (at your option) any later version. \n"
-" * \n"
-" * GEGL is distributed in the hope that it will be useful, \n"
-" * but WITHOUT ANY WARRANTY; without even the implied warranty of \n"
-" * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU \n"
-" * Lesser General Public License for more details. \n"
-" * \n"
-" * You should have received a copy of the GNU Lesser General Public \n"
-" * License along with GEGL; if not, see <http://www.gnu.org/licenses/>. \n"
-" * \n"
-" * Copyright 2013 Carlos Zubieta (czubieta dev gmail com) \n"
-" */ \n"
-" \n"
-"/* XXX: this file should be kept in sync with gegl-random. */ \n"
"#define XPRIME 103423 \n"
"#define YPRIME 101359 \n"
"#define NPRIME 101111 \n"
" \n"
"#define RANDOM_DATA_SIZE (15083+15091+15101) \n"
-"#define PRIME_SIZE 533 \n"
+"#define PRIME_SIZE 533u \n"
" \n"
-"static inline int \n"
+"static inline uint \n"
"_gegl_cl_random_int (__global const int *cl_random_data, \n"
" __global const long *cl_random_primes, \n"
" int seed, \n"
@@ -41,16 +41,16 @@ static const char* cl_random_source =
" /* 3 rounds gives a reasonably high cycle for */ \n"
" /* our synthesized larger random set. */ \n"
" unsigned long seed_idx = seed % (PRIME_SIZE - 1 - ROUNDS); \n"
-" int prime0 = convert_int(cl_random_primes[seed_idx]), \n"
-" prime1 = convert_int(cl_random_primes[seed_idx+1]), \n"
-" prime2 = convert_int(cl_random_primes[seed_idx+2]); \n"
+" int prime0 = cl_random_primes[seed_idx], \n"
+" prime1 = cl_random_primes[seed_idx+1], \n"
+" prime2 = cl_random_primes[seed_idx+2]; \n"
" int r0 = cl_random_data[idx % prime0], \n"
" r1 = cl_random_data[prime0 + (idx % (prime1))], \n"
" r2 = cl_random_data[prime0 + prime1 + (idx % (prime2))]; \n"
" return r0 ^ r1 ^ r2; \n"
"} \n"
" \n"
-"int \n"
+"uint \n"
"gegl_cl_random_int (__global const int *cl_random_data, \n"
" __global const long *cl_random_primes, \n"
" int seed, \n"
@@ -74,8 +74,8 @@ static const char* cl_random_source =
" int min, \n"
" int max) \n"
"{ \n"
-" int ret = _gegl_cl_random_int (cl_random_data, cl_random_primes, \n"
-" seed, x, y, z, n); \n"
+" uint ret = _gegl_cl_random_int (cl_random_data, cl_random_primes, \n"
+" seed, x, y, z, n); \n"
" return (ret % (max-min)) + min; \n"
"} \n"
" \n"
@@ -110,12 +110,18 @@ static const char* cl_random_source =
" int min, \n"
" int max) \n"
"{ \n"
-" int4 ret = gegl_cl_random_int4 (cl_random_data, cl_random_primes, \n"
-" seed, x, y, z, n); \n"
-" return (ret % (max-min)) + min; \n"
+" int r0 = gegl_cl_random_int_range(cl_random_data, cl_random_primes, \n"
+" seed, x, y, z, n, min, max); \n"
+" int r1 = gegl_cl_random_int_range(cl_random_data, cl_random_primes, \n"
+" seed, x, y, z, n+1, min, max); \n"
+" int r2 = gegl_cl_random_int_range(cl_random_data, cl_random_primes, \n"
+" seed, x, y, z, n+2, min, max); \n"
+" int r3 = gegl_cl_random_int_range(cl_random_data, cl_random_primes, \n"
+" seed, x, y, z, n+3, min, max); \n"
+" return (int4)(r0,r1,r2,r3); \n"
"} \n"
" \n"
-"#define G_RAND_FLOAT_TRANSFORM 0.00001525902189669642175f \n"
+"#define G_RAND_FLOAT_TRANSFORM 0.00001525902189669642175 \n"
" \n"
"float \n"
"gegl_cl_random_float (__global const int *cl_random_data, \n"
@@ -126,9 +132,9 @@ static const char* cl_random_source =
" int z, \n"
" int n) \n"
"{ \n"
-" int u = _gegl_cl_random_int (cl_random_data, cl_random_primes, \n"
-" seed, x, y, z, n); \n"
-" return convert_float(u & 0xffff) * G_RAND_FLOAT_TRANSFORM; \n"
+" uint u = _gegl_cl_random_int (cl_random_data, cl_random_primes, \n"
+" seed, x, y, z, n); \n"
+" return (u & 0xffff) * G_RAND_FLOAT_TRANSFORM; \n"
"} \n"
" \n"
"float \n"
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]