[Libclc-dev] [PATCH] Add image attribute getter builtins

Jeroen Ketema j.ketema at imperial.ac.uk
Mon Jun 8 16:11:57 PDT 2015


I’m not keeping track of the back-end, but has work been done there to support this?

> On 08 Jun 2015, at 15:46, Zoltan Gilian <zoltan.gilian at gmail.com> wrote:
> 
> Added get_image_* OpenCL builtins to the headers along with a dummy
> implementation. The builtins need to be replaced by the compiler.
> ---
> generic/include/clc/clc.h         |  4 +++
> generic/include/clc/image/image.h | 16 ++++++++++++
> generic/lib/SOURCES               |  1 +
> generic/lib/image/image.cl        | 54 +++++++++++++++++++++++++++++++++++++++
> 4 files changed, 75 insertions(+)
> create mode 100644 generic/include/clc/image/image.h
> create mode 100644 generic/lib/image/image.cl
> 
> diff --git a/generic/include/clc/clc.h b/generic/include/clc/clc.h
> index cab751d..5848a98 100644
> --- a/generic/include/clc/clc.h
> +++ b/generic/include/clc/clc.h
> @@ -180,6 +180,10 @@
> #include <clc/atomic/atomic_xchg.h>
> #include <clc/atomic/atomic_xor.h>
> 
> +/* 6.11.13 Image Read and Write Functions */
> +
> +#include <clc/image/image.h>
> +

I think this must be moved slightly. It now breaks the inclusion of the atomic headers into two parts.

> /* cl_khr_global_int32_base_atomics Extension Functions */
> #include <clc/cl_khr_global_int32_base_atomics/atom_add.h>
> #include <clc/cl_khr_global_int32_base_atomics/atom_cmpxchg.h>
> diff --git a/generic/include/clc/image/image.h b/generic/include/clc/image/image.h
> new file mode 100644
> index 0000000..23d2367
> --- /dev/null
> +++ b/generic/include/clc/image/image.h
> @@ -0,0 +1,16 @@
> +_CLC_OVERLOAD _CLC_DEF int get_image_width (image2d_t image);
> +_CLC_OVERLOAD _CLC_DEF int get_image_width (image3d_t image);
> +
> +_CLC_OVERLOAD _CLC_DEF int get_image_height (image2d_t image);
> +_CLC_OVERLOAD _CLC_DEF int get_image_height (image3d_t image);
> +
> +_CLC_OVERLOAD _CLC_DEF int get_image_depth (image3d_t image);
> +
> +_CLC_OVERLOAD _CLC_DEF int get_image_channel_data_type (image2d_t image);
> +_CLC_OVERLOAD _CLC_DEF int get_image_channel_data_type (image3d_t image);
> +
> +_CLC_OVERLOAD _CLC_DEF int get_image_channel_order (image2d_t image);
> +_CLC_OVERLOAD _CLC_DEF int get_image_channel_order (image3d_t image);
> +
> +_CLC_OVERLOAD _CLC_DEF int2 get_image_dim (image2d_t image);
> +_CLC_OVERLOAD _CLC_DEF int4 get_image_dim (image3d_t image);
> diff --git a/generic/lib/SOURCES b/generic/lib/SOURCES
> index 1e63994..a284747 100644
> --- a/generic/lib/SOURCES
> +++ b/generic/lib/SOURCES
> @@ -127,3 +127,4 @@ shared/vload.cl
> shared/vstore.cl
> workitem/get_global_id.cl
> workitem/get_global_size.cl
> +image/image.cl
> diff --git a/generic/lib/image/image.cl b/generic/lib/image/image.cl
> new file mode 100644
> index 0000000..0e89423
> --- /dev/null
> +++ b/generic/lib/image/image.cl
> @@ -0,0 +1,54 @@
> +#include <clc/clc.h>
> +
> +// An llvm pass will substitute these to the correct llvm register.
> +// Use intrinsics to mark the places for substitution.
> +int __clc_get_image_width_2d(image2d_t) __asm("llvm.opencl.image.get.width.2d");
> +int __clc_get_image_width_3d(image3d_t) __asm("llvm.opencl.image.get.width.3d");
> +int __clc_get_image_height_2d(image2d_t) __asm("llvm.opencl.image.get.height.2d");
> +int __clc_get_image_height_3d(image3d_t) __asm("llvm.opencl.image.get.height.3d");
> +int __clc_get_image_depth_3d(image3d_t) __asm("llvm.opencl.image.get.depth.3d");
> +int __clc_get_image_channel_data_type_2d(image2d_t) __asm("llvm.opencl.image.get.channel_data_type.2d");
> +int __clc_get_image_channel_data_type_3d(image3d_t) __asm("llvm.opencl.image.get.channel_data_type.3d");
> +int __clc_get_image_channel_order_2d(image2d_t) __asm("llvm.opencl.image.get.channel_order.2d");
> +int __clc_get_image_channel_order_3d(image3d_t) __asm("llvm.opencl.image.get.channel_order.3d");
> +
> +
> +_CLC_OVERLOAD _CLC_DEF int get_image_width(image2d_t image) {
> +  return __clc_get_image_width_2d(image);
> +}

Why is the indirection needed in this case and many of the following cases? Why not simply define

int get_image_width(image2d_t image) __asm("llvm.opencl.image.get.width.2d”);

in clc/image/image.h? That would follow what was initially done for some of the math builtins.

Jeroen

> +_CLC_OVERLOAD _CLC_DEF int get_image_width(image3d_t image) {
> +  return __clc_get_image_width_3d(image);
> +}
> +
> +_CLC_OVERLOAD _CLC_DEF int get_image_height(image2d_t image) {
> +  return __clc_get_image_height_2d(image);
> +}
> +_CLC_OVERLOAD _CLC_DEF int get_image_height(image3d_t image) {
> +  return __clc_get_image_height_3d(image);
> +}
> +
> +_CLC_OVERLOAD _CLC_DEF int get_image_depth(image3d_t image) {
> +  return __clc_get_image_depth_3d(image);
> +}
> +
> +_CLC_OVERLOAD _CLC_DEF int get_image_channel_data_type(image2d_t image) {
> +  return __clc_get_image_channel_data_type_2d(image);
> +}
> +_CLC_OVERLOAD _CLC_DEF int get_image_channel_data_type(image3d_t image) {
> +  return __clc_get_image_channel_data_type_3d(image);
> +}
> +
> +_CLC_OVERLOAD _CLC_DEF int get_image_channel_order(image2d_t image) {
> +  return __clc_get_image_channel_order_2d(image);
> +}
> +_CLC_OVERLOAD _CLC_DEF int get_image_channel_order(image3d_t image) {
> +  return __clc_get_image_channel_order_3d(image);
> +}
> +
> +_CLC_OVERLOAD _CLC_DEF int2 get_image_dim (image2d_t image) {
> +  return (int2)(get_image_width(image), get_image_height(image));
> +}
> +_CLC_OVERLOAD _CLC_DEF int4 get_image_dim (image3d_t image) {
> +  return (int4)(get_image_width(image), get_image_height(image),
> +                get_image_depth(image), 0);
> +}
> -- 
> 2.4.2
> 
> 
> _______________________________________________
> Libclc-dev mailing list
> Libclc-dev at pcc.me.uk
> http://www.pcc.me.uk/cgi-bin/mailman/listinfo/libclc-dev





More information about the Libclc-dev mailing list