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

Zoltán Gilián zoltan.gilian at gmail.com
Tue Jun 9 01:56:10 PDT 2015


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

Yes, but it is a work in progress at the moment.

> 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?

Good point, I'll move those defs to the header then.

Zoltan

On Tue, Jun 9, 2015 at 1:11 AM, Jeroen Ketema <j.ketema at imperial.ac.uk>
wrote:

>
> 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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/libclc-dev/attachments/20150609/90063d5e/attachment.html>


More information about the Libclc-dev mailing list