[Sbs_daq] Big endian raw data?

Ole Hansen ole at jlab.org
Sun Oct 3 15:06:20 EDT 2021


When EVIO opens a file, it looks for a "magic" word in a certain place 
early in the file. If it isn't found, it byte-swaps that word and checks 
if it matches the magic value then. If it does, it sets a flag that this 
file needs byte-swapping, and all header and data words, except 
"unknown" data (see the swap_data routine in evioswap.c), are then 
swapped. There is no (easy) way to enable/disable this flag outside of 
the library; it's hardcoded, pre-determined behavior.

I am also not sure if there are any flags in any of the headers to 
indicate the endianness of the data. It would just require a single bit. 
The headers are not user-accessible anyway, BTW, so it looks like you're 
on your own to find out whether you need swapping, on a per-module or 
per-ROC basis, I guess. Like I said, it's not very clear. What does "VME 
is big endian" really mean? An Intel CPU in a VME crate produces what 
endianness ... 🤔

Ole

On 3.10.21 at 14:21, Alexandre Camsonne wrote:
> Everything is intel besided VTP. Though Dave mentionned VME was big 
> endian.
>
> Alexandre
>
> On Sun, Oct 3, 2021, 13:56 Paul King <pking at jlab.org 
> <mailto:pking at jlab.org>> wrote:
>
>     I can comment that when I wrote the helicity scaler library, I
>     found that I needed to byte swap the data words (module data and
>     diagnostic counters) on the crate in order to be decoded correctly.
>     I'm not sure if halladaq8 is an Intel or arm cpu.
>
>     Does Podd or evio2xml do a dynamic check of endianness and then
>     byteswap, or is that explicitly enabled?
>
>     Sent from my mobile device.
>     Get Outlook for Android
>     <https://urldefense.proofpoint.com/v2/url?u=https-3A__aka.ms_ghei36&d=DwMFaQ&c=CJqEzB1piLOyyvZjb8YUQw&r=FxpSg1qAggzMg8YCjcvm4w&m=W_Py47zEQFMF4YLSxKlQ6YvCZkjxlCgMIaViW0IvmiA&s=HtjtqwZf9TY9s3jftpebziiNiD97Y3BAaURjA_dYHjc&e=>
>     ------------------------------------------------------------------------
>     *From:* Sbs_daq <sbs_daq-bounces at jlab.org
>     <mailto:sbs_daq-bounces at jlab.org>> on behalf of Andrew Puckett
>     <puckett at jlab.org <mailto:puckett at jlab.org>>
>     *Sent:* Sunday, October 3, 2021 1:31:05 PM
>     *To:* Robert Michaels <rom at jlab.org <mailto:rom at jlab.org>>; Ole
>     Hansen <ole at jlab.org <mailto:ole at jlab.org>>; sbs_daq at jlab.org
>     <mailto:sbs_daq at jlab.org> <sbs_daq at jlab.org <mailto:sbs_daq at jlab.org>>
>     *Subject:* Re: [Sbs_daq] Big endian raw data?
>
>     Interesting. So perhaps I’m being naïve here, but other than the
>     byte-swapping inefficiency Ole pointed out in processing the raw
>     data on the compute farm nodes, is there an actual problem here?
>     Do we need to check/care about this in the software in writing our
>     raw data decoders?
>
>     The cause of Bradley’s crash while processing GRINCH data doesn’t
>     necessarily seem related to this…
>
>     Andrew
>
>     *From: *Robert Michaels <rom at jlab.org <mailto:rom at jlab.org>>
>     *Date: *Sunday, October 3, 2021 at 1:21 PM
>     *To: *Ole Hansen <ole at jlab.org <mailto:ole at jlab.org>>, Andrew
>     Puckett <puckett at jlab.org <mailto:puckett at jlab.org>>,
>     sbs_daq at jlab.org <mailto:sbs_daq at jlab.org> <sbs_daq at jlab.org
>     <mailto:sbs_daq at jlab.org>>
>     *Subject: *Re: [Sbs_daq] Big endian raw data?
>
>     I believe there are byte-swapping routines available in the DAQ
>     libraries which allow to put the bytes in the right state and be
>     consistent.  But the DAQ expert needs to make this happen.  Below
>     is a snippet of an email from Dave Abbott about a year ago when I
>     was having some trouble, which I think is relevant..  Dave is a
>     good person to ask.  Can ask Bryan Moffit or Alexandre, too.
>
>     ---------------------- snippet of email from Dave Abbott
>     ------------------------
>
>     The CODA data files are written from a Java Event Builder. JAVA is
>     inherently Big Endian. The EVIO
>
>     files will be by default in big endian.
>
>     However, ALL Banks of User data - created in your readout list -
>     will NOT be swapped. They will stay
>
>     whatever Endian it was when it was written.
>
>     Typically the ROC will run in Linux on Intel which is Little
>     Endian. Therefore the Data banks you create will stay
>
>     little endian. However the Bank headers will be swapped to be
>     compatible with the rest of the CODA file.
>
>     An even more confusing possibility is that you might do a DMA from
>     the VME bus into a CODA data Bank.
>
>     The VME bus is Big endian. Therefore the data from the VME bus
>     will stay Big endian in this bank.
>
>     Our general rule for CODA 3 is that for purposes of DAQ we will
>     not touch (or modify) the User's data in any way.
>
>     We will only modify the EVIO headers to match the endianess of
>     whatever System writes the file.
>
>     ------------------------------------------------------------------------
>
>     *From:*Sbs_daq <sbs_daq-bounces at jlab.org
>     <mailto:sbs_daq-bounces at jlab.org>> on behalf of Ole Hansen
>     <ole at jlab.org <mailto:ole at jlab.org>>
>     *Sent:* Sunday, October 3, 2021 1:06 PM
>     *To:* Andrew Puckett <puckett at jlab.org <mailto:puckett at jlab.org>>;
>     sbs_daq at jlab.org <mailto:sbs_daq at jlab.org> <sbs_daq at jlab.org
>     <mailto:sbs_daq at jlab.org>>
>     *Subject:* Re: [Sbs_daq] Big endian raw data?
>
>     Maybe our various front-ends differ in endianness, so we write
>     mixed-endian data?!? That would be disastrous since it is not
>     supported by EVIO. A file can only be one or the other—a very
>     binary view. (I guess EVIO was written before we became
>     diversity-aware ;) ).
>
>     Ole
>
>     On 3.10.21 at 13:03, Andrew Puckett wrote:
>
>         Hi Ole,
>
>         This is interesting. The GRINCH data are being read out by the
>         new VETROC modules, I don’t know if they differ from the other
>         modules in terms of “endian-ness”. Maybe a DAQ expert can
>         weigh in here?
>
>         Andrew
>
>         *From: *Sbs_daq <sbs_daq-bounces at jlab.org>
>         <mailto:sbs_daq-bounces at jlab.org> on behalf of Ole Hansen
>         <ole at jlab.org> <mailto:ole at jlab.org>
>         *Date: *Sunday, October 3, 2021 at 1:00 PM
>         *To: *sbs_daq at jlab.org <mailto:sbs_daq at jlab.org>
>         <sbs_daq at jlab.org> <mailto:sbs_daq at jlab.org>
>         *Subject: *[Sbs_daq] Big endian raw data?
>
>         Hi guys,
>
>         Bradley reported a crash of the replay (actually in EVIO) with
>         /adaq1/data1/sbs/grinch_72.evio.0 (see
>         https://logbooks.jlab.org/entry/3916105
>         <https://logbooks.jlab.org/entry/3916105>).
>
>         When digging into the cause of this crash, I discovered that
>         these raw data are written in big-endian format. How can this
>         be? I thought the front-ends are Intel processors. Are we
>         taking data with ARM chips that are configured for big-endian
>         mode? Is this a mistake, or is there some plan to it?
>
>         These big-endian data have to be byte-swapped when processing
>         them on x86, which is what all our compute nodes run. That's a
>         LOT of work. It leads to significant and seemingly completely
>         unnecessary overhead. I.e. we're burning CPU cycles for
>         nothing good, it seems.
>
>         Please explain.
>
>         Ole
>
>     _______________________________________________
>     Sbs_daq mailing list
>     Sbs_daq at jlab.org <mailto:Sbs_daq at jlab.org>
>     https://mailman.jlab.org/mailman/listinfo/sbs_daq
>     <https://mailman.jlab.org/mailman/listinfo/sbs_daq>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.jlab.org/pipermail/sbs_daq/attachments/20211003/60e8e9dd/attachment-0001.html>


More information about the Sbs_daq mailing list