On Wed, 2016-06-22 at 17:07 -0700, Francisco Jerez wrote:
> Jan Vesely <jan.ves...@rutgers.edu> writes:
> 
> > On Mon, 2016-06-13 at 17:24 -0700, Francisco Jerez wrote:
> > > Serge Martin <edb+m...@sigluy.net> writes:
> > > 
> > > > This fix getting the size of a struct arg. vec3 types still
> > > > work
> > > > ok.
> > > > Only buit-in args need to have power of two alignment,
> > > > getTypeAllocSize
> > > > reports the correct size.
> > > > ---
> > > >  src/gallium/state_trackers/clover/llvm/invocation.cpp | 3 ++-
> > > >  1 file changed, 2 insertions(+), 1 deletion(-)
> > > > 
> > > > diff --git
> > > > a/src/gallium/state_trackers/clover/llvm/invocation.cpp
> > > > b/src/gallium/state_trackers/clover/llvm/invocation.cpp
> > > > index 03487d6..9af51539 100644
> > > > --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
> > > > +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
> > > > @@ -472,7 +472,8 @@ namespace {
> > > >           // aligned to the next larger power of two".  We need
> > > > this
> > > >           // alignment for three element vectors, which have
> > > >           // non-power-of-2 store size.
> > > > -         const unsigned arg_api_size =
> > > > util_next_power_of_two(arg_store_size);
> > > > +         const unsigned arg_api_size = arg_type->isStructTy()
> > > > ?
> > > > +               arg_store_size :
> > > > util_next_power_of_two(arg_store_size);
> > > >  
> > > Hm...  Isn't this still going to be broken if you pass a struct
> > > argument
> > > to a kernel function and the alignment of any of the struct
> > > members
> > > doesn't match the target-specific data layout?  Not sure we can
> > > fix
> > > this
> > > sensibly without requiring the target's data layout to match the
> > > CL
> > > API
> > > exactly.  Any suggestions Tom?
> > 
> > according to 6.7.2.1 compilers can arbitrarily insert padding
> > between
> > struct members (except at the beginning).
> 
> What spec version are you looking at?  My CL spec doesn't have any
> section labeled 6.7.2.1.

c99 specs, I did not find anything specific for CLC (it might be that I
just need to look harder). CLC 2.0 adds additional constraint that you
can't use address space qualifiers.

> 
> > Even if size/alignment of individual members match CL API exactly,
> > there's no guarantee that the structure layout/size will be the
> > same.
> > 
> How can you exchange structured data with a CL kernel then, assuming
> that the layout of structure types in memory is fully unspecified as
> you
> say?

that is my point. My understanding is that it relies on a silent
assumption that both CLC and the host compiler will create the same
structure layout given the same structure elements.

big endian host can create:
struct foo {
        cl_int a;
        // 16 bit padding;
        cl_short b;
        cl_int c;
};
while little endian device could create:
struct foo {
        int a;
        short b;
        // 16 bit padding
        int c;
};

If cl_short/short alignment is 2bytes, the above structures and all the
members have the same size/alignment, yet are not compatible.

Am I missing something that would prevent the above?

Jan

> 
> > Jan
> > 
> > > 
> > > >           llvm::Type *target_type = arg_type->isIntegerTy() ?
> > > >                 TD.getSmallestLegalIntType(mod->getContext(),
> > > > arg_store_size * 8)
> > > > -- 
> > > > 2.5.5
> > -- 
> > 
> > Jan Vesely <jan.ves...@rutgers.edu>
-- 

Jan Vesely <jan.ves...@rutgers.edu>

Attachment: signature.asc
Description: This is a digitally signed message part

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to