Re: __sync_fetch

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Ian,

Thanks for your reply.

I am not sure why the casting in your example will cause any issue as I thought without __pack__, the variable a will be aligned by gcc, no?  And you are trying to get the address of &a[0] (which is fixed) and then cast to long*, shouldn't have anything do with alignment....or do you mean long p = (long)(*a)?

Thanks in advance.



----- Original Message -----
From: Ian Lance Taylor <iant@xxxxxxxxxx>
To: Hei Chan <structurechart@xxxxxxxxx>
Cc: 
Sent: Sunday, November 18, 2012 9:14 PM
Subject: Re: __sync_fetch

On Sun, Nov 18, 2012 at 9:03 PM, Hei Chan <structurechart@xxxxxxxxx> wrote:
> You mean:
> 1. the variable I am trying to read doesn't belong to a packed struct; and

Yes.

> 2. I am not casting to something not 8 byte long on a 64 bit machine?  I
> thought casting would happen after the variable is stored in register?

I'm sorry, I don't know what you mean.

By casting I mean something like
  char a[16];
  long *p = (long *) a;
Nothing here makes a aligned.

If you want to continue this discussion, please use the mailing list,
not private mail to me.  Thanks.

Ian




> From: Ian Lance Taylor <iant@xxxxxxxxxx>
> To: Hei Chan <structurechart@xxxxxxxxx>
> Sent: Sunday, November 18, 2012 7:26 PM
> Subject: Re: __sync_fetch
>
> On Sun, Nov 18, 2012 at 7:02 PM, Hei Chan <structurechart@xxxxxxxxx> wrote:
>> So the case you mentioned about unaligned cache line shouldn't happen,
>> right?
>
> Unless you are doing something unusual involving casts or packed
> structs, that is correct.
>
> Ian
>
>
>> Just want to check (so that I can shave another few hundreds nano sec in
>> my code).
>>
>> Thanks in advance.
>>
>>
>> ----- Original Message -----
>> From: Ian Lance Taylor <iant@xxxxxxxxxx>
>> To: Hei Chan <structurechart@xxxxxxxxx>
>> Cc: "gcc-help@xxxxxxxxxxx" <gcc-help@xxxxxxxxxxx>
>> Sent: Sunday, November 18, 2012 6:57 PM
>> Subject: Re: __sync_fetch
>>
>> On Sun, Nov 18, 2012 at 11:31 AM, Hei Chan <structurechart@xxxxxxxxx>
>> wrote:
>>> I just spoke with my coworker about this.  We just wonder whether C++
>>> standard/GCC guarantees all the variables will be aligned if we don't
>>> request for unaligned (e.g. __packed__).
>>
>> Yes.
>>
>> Ian
>>
>>> ----- Original Message -----
>>> From: Ian Lance Taylor <iant@xxxxxxxxxx>
>>> To: Hei Chan <structurechart@xxxxxxxxx>
>>> Cc: "gcc-help@xxxxxxxxxxx" <gcc-help@xxxxxxxxxxx>
>>> Sent: Sunday, November 18, 2012 12:18 AM
>>> Subject: Re: __sync_fetch
>>>
>>> On Sun, Nov 18, 2012 at 12:10 AM, Hei Chan <structurechart@xxxxxxxxx>
>>> wrote:
>>>>
>>>> How about on a 64-bit Intel processor, I use __sync_fetch_and_*() to
>>>> write to a long variable, but never use any __sync_*() to read?  Under what
>>>> situation that I will read something invalid?
>>>
>>> On a 64-bit Intel processor, if the 64-bit value is at an aligned
>>> adress, then to the best of my knowledge that will always be fine.  If
>>> the 64-bit value is misaligned and crosses a cache line, then if you
>>> are unlucky I believe that a write can occur in between reading the
>>> two different cache lines, causing you to read a value that was never
>>> written.
>>>
>>> I feel compelled to add that attempting to reason about this sort of
>>> thing generally means that you are making a mistake.  Unless you are
>>> writing very low-level code, such as the implementation of mutex, it's
>>> best to avoid trying to think this way.
>>>
>>> Ian
>>>
>>>
>>>
>>>> ----- Original Message -----
>>>> From: Ian Lance Taylor <iant@xxxxxxxxxx>
>>>> To: Hei Chan <structurechart@xxxxxxxxx>
>>>> Cc: "gcc-help@xxxxxxxxxxx" <gcc-help@xxxxxxxxxxx>
>>>> Sent: Sunday, November 18, 2012 12:07 AM
>>>> Subject: Re: __sync_fetch
>>>>
>>>> On Sat, Nov 17, 2012 at 11:04 PM, Hei Chan <structurechart@xxxxxxxxx>
>>>> wrote:
>>>>>
>>>>> After searching more for info, it seems like even though on a
>>>>>  64-bit machine, reading a long (i.e. 8 bytes) is one operation, it
>>>>> might not give the "correct" value:
>>>>> http://gcc.gnu.org/ml/gcc/2008-03/msg00201.html
>>>>>
>>>>> And so, we have to use __sync_fetch_and_add(&x, 0) to read?
>>>>>
>>>>> Could
>>>>>  someone elaborate a situation that reading a long variable won't get
>>>>> the correct value given that all writes in the application use
>>>>> __sync_fetch_*()?
>>>>
>>>> If you always use __sync_fetch_and_add(&x, 0) to read a value, and you
>>>> always use __sync_fetch_and_add to write the value also with some
>>>> appropriate detla, then all the accesses to that variable should be
>>>> atomic with sequential consistency.  That should be true on any
>>>> processors that implements __sync_fetch_and_add in the appropriate
>>>> size.
>>>>
>>>> Ian
>>>>
>>>
>>
>
>




[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux