Да, подреждането все още се прилага за оптимизациите на компилатора.
Освен това не е съвсем точно, че на x86 "операциите за атомарно зареждане са винаги еднакви".
На x86 всички зареждания, извършени с mov
, имат семантика за придобиване и всички съхранявания, извършени с mov
, имат семантика за освобождаване. Така че acq_rel, acq и отпуснатите натоварвания са прости mov
s и по подобен начин acq_rel, rel и отпуснатите магазини (acq запасите и rel натоварванията винаги са равни на отпуснати).
Това обаче не е непременно вярно за seq_cst: архитектурата не гарантира семантика на seq_cst за mov
. Всъщност наборът от инструкции x86 няма специфични инструкции за последователно последователно зареждане и съхраняване. Само атомарните операции за четене-модифициране-запис на x86 ще имат seq_cst семантика. Следователно можете да получите seq_cst семантика за товари, като извършите операция fetch_and_add (lock xadd
инструкция) с аргумент 0 и seq_cst семантика за магазини, като извършите seq_cst обменна операция (xchg
инструкция) и отхвърлите предишната стойност.
Но не е нужно да правите и двете! Докато всички запаметявания на seq_cst се извършват с xchg
, зарежданията на seq_cst могат да бъдат реализирани просто с mov
. Двойно, ако всички зареждания бяха извършени с lock xadd
, съхраняванията на seq_cst биха могли да бъдат реализирани просто с mov
.
xchg
и lock xadd
са много по-бавни от mov
. Тъй като една програма има (обикновено) повече зареждания, отколкото съхранява, удобно е да се правят seq_cst съхранява с xchg
, така че (по-честите) seq_cst зареждания могат просто да използват mov
. Тази подробност на изпълнението е кодифицирана в x86 Application Binary Interface (ABI). На x86 съвместимият компилатор трябва да компилира seq_cst съхранява в xchg
, така че зарежданията на seq_cst (които може да се появят в друга преводна единица, компилирана с различен компилатор) да могат да се извършват с по-бързата mov
инструкция.
Следователно не е вярно като цяло, че зарежданията на seq_cst и придобиването се извършват с една и съща инструкция на x86. Вярно е само защото ABI указва, че хранилищата seq_cst се компилират до xchg
.
person
Paolo Bonzini
schedule
29.08.2013