[Mesa-dev] [PATCH 2/2] clover: fix getting struct args api size
Jan Vesely
jan.vesely at rutgers.edu
Thu Jun 23 00:28:07 UTC 2016
On Wed, 2016-06-22 at 17:07 -0700, Francisco Jerez wrote:
> Jan Vesely <jan.vesely at rutgers.edu> writes:
>
> > On Mon, 2016-06-13 at 17:24 -0700, Francisco Jerez wrote:
> > > Serge Martin <edb+mesa at 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.vesely at rutgers.edu>
--
Jan Vesely <jan.vesely at rutgers.edu>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160622/d76cb759/attachment.sig>
More information about the mesa-dev
mailing list