[Beignet] [PATCH 1/4] Define clamp(value, lower, upper)

Zhigang Gong zhigang.gong at linux.intel.com
Thu May 16 20:36:48 PDT 2013


LGTM. I guess the reason that why the previous kernel was using a private clamp
is that when it was created, there is no clamp definition in ocl_stdlib.h:).

But it's still a little weird that the private definition always implicitly
use integer arguments. Anyway, this patch looks good for me. Will push it
soon. Thanks.

On Mon, May 13, 2013 at 08:21:15PM +0200, Simon Richter wrote:
> The clamp(value, lower, upper) function is part of the standard library.
> 
>  - Define the function, using min() and max() on the lower level
>  - Remove private definitions from kernels
> ---
>  backend/src/ocl_stdlib.h                    |   21 ++++++++++++---------
>  kernels/compiler_julia.cl                   |    2 --
>  kernels/compiler_julia_no_break.cl          |    2 --
>  kernels/compiler_menger_sponge.cl           |    2 --
>  kernels/compiler_menger_sponge_no_shadow.cl |    2 --
>  kernels/compiler_nautilus.cl                |    4 +---
>  6 files changed, 13 insertions(+), 20 deletions(-)
> 
> diff --git a/backend/src/ocl_stdlib.h b/backend/src/ocl_stdlib.h
> index 4c0d39c..7027373 100644
> --- a/backend/src/ocl_stdlib.h
> +++ b/backend/src/ocl_stdlib.h
> @@ -484,21 +484,24 @@ DECL_SELECT4(float4, float, uint4, 0x80000000)
>  /////////////////////////////////////////////////////////////////////////////
>  // Common Functions (see 6.11.4 of OCL 1.1 spec)
>  /////////////////////////////////////////////////////////////////////////////
> -#define DECL_MIN_MAX(TYPE) \
> +#define DECL_MIN_MAX_CLAMP(TYPE) \
>  INLINE OVERLOADABLE TYPE max(TYPE a, TYPE b) { \
>    return a > b ? a : b; \
>  } \
>  INLINE OVERLOADABLE TYPE min(TYPE a, TYPE b) { \
>    return a < b ? a : b; \
> +} \
> +INLINE OVERLOADABLE TYPE clamp(TYPE v, TYPE l, TYPE u) { \
> +  return max(min(v, u), l); \
>  }
> -DECL_MIN_MAX(float)
> -DECL_MIN_MAX(int)
> -DECL_MIN_MAX(short)
> -DECL_MIN_MAX(char)
> -DECL_MIN_MAX(uint)
> -DECL_MIN_MAX(unsigned short)
> -DECL_MIN_MAX(unsigned char)
> -#undef DECL_MIN_MAX
> +DECL_MIN_MAX_CLAMP(float)
> +DECL_MIN_MAX_CLAMP(int)
> +DECL_MIN_MAX_CLAMP(short)
> +DECL_MIN_MAX_CLAMP(char)
> +DECL_MIN_MAX_CLAMP(uint)
> +DECL_MIN_MAX_CLAMP(unsigned short)
> +DECL_MIN_MAX_CLAMP(unsigned char)
> +#undef DECL_MIN_MAX_CLAMP
>  
>  INLINE OVERLOADABLE float __gen_ocl_internal_fmax(float a, float b) { return max(a,b); }
>  INLINE OVERLOADABLE float __gen_ocl_internal_fmin(float a, float b) { return min(a,b); }
> diff --git a/kernels/compiler_julia.cl b/kernels/compiler_julia.cl
> index 996c0b7..98c5799 100644
> --- a/kernels/compiler_julia.cl
> +++ b/kernels/compiler_julia.cl
> @@ -14,8 +14,6 @@ inline vec3 reflect(vec3 I, vec3 N) {
>    return I - 2.0f * dot(N, I) * N;
>  }
>  
> -inline float clamp(x,m,M) { return max(min(x,M),m); }
> -
>  inline uint pack_fp4(float4 u4) {
>    uint u;
>    u = (((uint) u4.x)) |
> diff --git a/kernels/compiler_julia_no_break.cl b/kernels/compiler_julia_no_break.cl
> index c0bd3b1..1a9be64 100644
> --- a/kernels/compiler_julia_no_break.cl
> +++ b/kernels/compiler_julia_no_break.cl
> @@ -14,8 +14,6 @@ inline vec3 reflect(vec3 I, vec3 N) {
>    return I - 2.0f * dot(N, I) * N;
>  }
>  
> -inline float clamp(x,m,M) { return max(min(x,M),m); }
> -
>  inline uint pack_fp4(float4 u4) {
>    uint u;
>    u = (((uint) u4.x)) |
> diff --git a/kernels/compiler_menger_sponge.cl b/kernels/compiler_menger_sponge.cl
> index b59c5e3..58af12a 100644
> --- a/kernels/compiler_menger_sponge.cl
> +++ b/kernels/compiler_menger_sponge.cl
> @@ -25,8 +25,6 @@ inline vec3 reflect(vec3 I, vec3 N) {
>    return I - 2.0f * dot(N, I) * N;
>  }
>  
> -inline float clamp(x,m,M) { return max(min(x,M),m); }
> -
>  inline uint pack_fp4(float4 u4) {
>    uint u;
>    u = (((uint) u4.x)) |
> diff --git a/kernels/compiler_menger_sponge_no_shadow.cl b/kernels/compiler_menger_sponge_no_shadow.cl
> index 4f1093f..95469c5 100644
> --- a/kernels/compiler_menger_sponge_no_shadow.cl
> +++ b/kernels/compiler_menger_sponge_no_shadow.cl
> @@ -25,8 +25,6 @@ inline vec3 reflect(vec3 I, vec3 N) {
>    return I - 2.0f * dot(N, I) * N;
>  }
>  
> -inline float clamp(x,m,M) { return max(min(x,M),m); }
> -
>  inline uint pack_fp4(float4 u4) {
>    uint u;
>    u = (((uint) u4.x)) |
> diff --git a/kernels/compiler_nautilus.cl b/kernels/compiler_nautilus.cl
> index b53771c..aa7251a 100644
> --- a/kernels/compiler_nautilus.cl
> +++ b/kernels/compiler_nautilus.cl
> @@ -14,8 +14,6 @@ inline vec3 reflect(vec3 I, vec3 N) {
>    return I - 2.0f * dot(N, I) * N;
>  }
>  
> -inline float clamp(x,m,M) { return max(min(x,M),m); }
> -
>  inline uint pack_fp4(float4 u4) {
>    uint u;
>    u = (((uint) u4.x)) |
> @@ -59,7 +57,7 @@ __kernel void compiler_nautilus(__global uint *dst, float resx, float resy, int
>    for(int q=0;q<100;q++)
>    {
>       float l = e(o+0.5f*(vec3)(cos(1.1f*(float)(q)),cos(1.6f*(float)(q)),cos(1.4f*(float)(q))))-m;
> -     a+=clamp(4.0f*l,0.0f,1.0f);
> +     a+=floor(clamp(4.0f*l,0.0f,1.0f));
>    }
>    v*=a/100.0f;
>    vec4 gl_FragColor=(vec4)(v,1.0f);
> -- 
> 1.7.10.4
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list