[pooma-dev] Re: [PATCH] Fix FileSetReader/Writer

Jeffrey D. Oldham oldham at codesourcery.com
Thu Sep 2 16:55:03 UTC 2004


Richard Guenther wrote:

> Jeffrey D. Oldham wrote:
>
>> Richard Guenther wrote:
>>
>>> On Wed, 1 Sep 2004, Richard Guenther wrote:
>>>
>>>  
>>>
>>>> On Wed, 1 Sep 2004 oldham at sirius.codesourcery.com wrote:
>>>>
>>>>  
>>>>
>>>>>  regressions.io.filesetreadertest1             : FAIL
>>>>>    Unexpected exit_code, standard error.
>>>>>
>>>>>  regressions.io.filesetreadertest2             : FAIL
>>>>>    Unexpected exit_code, standard error.
>>>>>     
>>>>
>>>>
>>>> I finally figured out why these fail on ia32 (but not on amd64 and 
>>>> ia64).
>>>> The test data was appearantly generated on a 64bit big-endian host 
>>>> and the
>>>> reader just reads bytes and expects a C++ long to be 64bit everywhere
>>>> (which is not true obviously).
>>>>
>>>> There is also the POOMA_HAS_LONG_LONG define which is set nowhere
>>>> and used only in the FileSetReader/Writer and ElementProperties.
>>>>
>>>> We could check for an appropriate 64bit type during configure and
>>>> use that or just ignore the issue.
>>>>   
>>>
>>>
>>>
>>> Yay, and of course this is not enough, as required alignment for 64bit
>>> datatypes is of course different.  We should shoot the one that came up
>>> with
>>>
>>>  template <class T>
>>>  struct OffsetData
>>>  {
>>>    void reverseBytes();
>>>
>>>    int nodedata[6*Dim];  // domain data (same format as .layout)
>>>    bool isCompressed;    // Is the data compressed
>>>    Offset_t offset;      // offset in sizeof(T) units
>>>    T compressedValue;    // Data value, if compressed
>>>  };
>>>
>>> as possibly "portable" structure to write byte-for-byte to a file.
>>> Placing bool between int and long long is surely not a good idea.
>>>
>>> Changing the above to
>>>
>>>    int nodedata[6*Dim];  // domain data (same format as .layout)
>>>    union {
>>>      bool isCompressed;  // Is the data compressed
>>>      char pad[8];
>>>    } u;
>>>    Offset_t offset;      // offset in sizeof(T) units
>>>
>>> _seems_ to "fix" the problem.
>>>
>>> So, is the following patch ok?  Tested on ia32, amd64 and ia64 linux.
>>>
>>>  
>>>
>> This patch seems to contain two ideas: 1) add POOMA_INT64 and 2) 
>> changing OffsetData.  Ensuring use of 64-bit values seems to be a 
>> good idea.  I am unsure why the order of structure data members is 
>> important.  C++ compilers should obey the C++ ABI 
>> (http://www.codesourcery.com/cxx-abi/) so the structure will be laid 
>> out in the same way on all machines.
>
>
> I don't think so.  Fact is, that different compilers obey different 
> C++ ABIs, so the structure may be layed out differently on IRIX with 
> CC than on ia32 with g++.  I'm not trying to fix all possible 
> problems, but just the fact that all 64bit ABIs I know of force 
> alignment of 8-byte types
> (like Offset_t) on 8-byte boundaries.  The 32bit g++ ABI on ia32 though
> requires only 4-byte boundary for the 8-byte long long (or maybe it's a
> bug in g++).
>
> Of course properly fixing it for all cases would need a
> packed structure for the read/write with a byte-wise copy to a properly
> aligned structure for further use.  But that is beyond the patch. 
> Rather than doing that I'd bring over parts of my HDF5 support.
>
>> Does using just (1) solve the problem?
>
>
> No.  You'll get sizeof(OffsetData) of 96 for ia64 and 92 for ia32 with
> offset of offset being 80 for the one case and 76 for the other.
>
> I just tested the patch on a 32bit big-endian machine (ppc) and it 
> works there, too.
>
> Richard.

It is possible to change your patch to use an Offset_t instead of 
char[8]?  This seems a more portable way to align to 64 bits.

Regardless, please commit your patch.  I guess these two items will no 
longer fail in the nightly tests starting 03Sep.

Thanks for fixing this.

-- 
Jeffrey D. Oldham
oldham at codesourcery.com




More information about the pooma-dev mailing list