Release

Barry Smith bsmith at mcs.anl.gov
Fri Sep 28 22:13:16 CDT 2007



> Well, I followed the approach in Python 3.0 for
> defining the base object header for derived objects.

  Lisandro,

  Please send a reference to where this is discussed and an explanation
why this type of caste is allowed with strict aliasing? (the web page
http://www.cellperformance.com/mike_acton/2006/06/understanding_strict_aliasing.html
does not discuss this case nor does it give any indication that this
"trick" is legal with strict alaising).

   Thanks

    Barry



On Wed, 26 Sep 2007, Lisandro Dalcin wrote:

> On 9/25/07, Barry Smith <bsmith at mcs.anl.gov> wrote:
> >     Please explain in detail.
> 
> Well, this article explains strict aliasing in some detail (just in
> case you does not know the details)
> 
> http://www.cellperformance.com/mike_acton/2006/06/understanding_strict_aliasing.html
> 
> In the particular case of PETSc, if I understand correctly, the
> designed object's struct inheritance based in the current PETSCHEADER
> approach will not make it possible to enable strict aliasing rules.
> For the compiler, PetscObject and Vec are different types of objects,
> so if you do
> 
> PetscObject o = (PetscObject)v;
> 
> you are breacking strict aliasing rules, using o->comm and v->comm to
> access the vector communicator could possibly fail with aggresive
> compiler optimization.
> 
> How to solve this?? Well, I followed the approach in Python 3.0 for
> defining the base object header for derived objects. In the case of
> PETSc, this amounts to the following:
> 
> #define PETSCHEADERBASE \
>   PetscCookie    cookie;
>   MPI_Comm       comm;
>   char*                prefix;
>   char*                type_name;
>   /* etc ....*/
> 
> struct _p_PetscObject {
>   PETSCHEADERBASE
> };
> 
> #define PETSCHEADER(ObjectOps) \
>   struct _p_PetscObject header;
>   ObjectOps                   *ops;
> 
> And now the Vec struct is declared as before:
> 
> struct _p_Vec {
>   PETSCHEADER(struct _VecOps);
>   /* etc ... */
> };
> 
> Now, there is no way to access things like cookie/comm/prefix fro a
> Vec, for doing it you need to cast to PetscObject. This removes the
> possibility of accesing 'comm' or 'prefix' though pointers of
> different types. As a side effect, you need to always cast to
> PetscObject to get comm/prefix/type_name (by far the more commonly
> accessed members when implementing Vec/Mat/KSP etc...)
> 
> I'm started this work at home, I do not have the code here at my
> office right now, but I could remove almost all the warnings related
> to strict aliasing in 'src/sys' and 'src
> 
> > > I have also some problems when calling PetscObjectQueryFunction, >
> >    Yes this function pointer casting stuff is a royal pain and ugly.
> 
> Perhaps I can find better way of doing this using a macro.
> 
> >
> >   Might be easier to just rewrite everything in C++. :-)
> >
> 
> Well, having error handling based on C++ exceptions is really
> tempting. But C++ polymorphism would make it easier to derive specific
> implementations of objects, and using smart pointer would help for the
> automatic reference counting of owned objects, and a lot of more good
> things. BUT... the PETSc way of doing polimorphism is a bit more
> powerful than the C++ virtual table. That is, each object instance
> have its own table of functions pointers, and you can freely replace
> it in a object by object base (and done in some MatConvert() calls).
> Of course, a C++ implementation could still use tables of function
> pointer, and dispatching code based on that table.
> 
> All this would require a lot, lot of redesing and work. :)
> 
> BTW, Could you please teach me some easy way of replacing in PETSc
> source code the following:
> 
> 'something>comm'    by   '((PetscObject)something)->comm'
> 
> I never found the time to learn regular expresions and 'sed'  :-(.
> 
> 
> 
> >
> >   Barry
> >
> > > In case
> > > you want me to continue this work, I will need a bit of help in a few
> > > places related to low-level calls related to sockets and sys calls.
> > >
> > >
> >
> >
> 
> 
> 




More information about the petsc-dev mailing list