Ставить под сомнение обоснованность барьеров PowerPC в атомах, порожденных GCC - PullRequest
0 голосов
/ 14 сентября 2018

GCC реализует __sync_val_compare_and_swap на PowerPC [64] как:

    sync
1:  lwarx 9,0,3
    cmpw 0,9,4
    bne 0,2f
    stwcx. 5,0,3
    bne 0,1b
2:  isync

Документы GCC для встроенных __sync_*:

В большинстве случаев эти встроенные функции рассматриваютсяполный барьер.То есть, операнд памяти не будет перемещаться по операции, ни вперед, ни назад.Кроме того, по мере необходимости будут выдаваться инструкции, чтобы процессор не мог спекулировать нагрузками во время операции и ставить в очередь хранилища после операции.

Однако использование isync вместо sync в конце меня беспокоит.Это на самом деле полный барьер?Или:

  1. Не удалось ли выполнить загрузки после того, как __sync_val_compare_and_swap не смог увидеть магазины, выполненные до того, как магазин, выдавший значение __sync_val_compare_and_swap загружен?

  2. Могут ли хранилища, выполненные после __sync_val_compare_and_swap, быть видимыми другими потоками, прежде чем они увидят значение, сохраненное в __sync_val_compare_and_swap?

...