6

Bu soru ile ilgili olarak, sadece x86 ve x86-64 ile ilgileniyorum.
MSVC 2005 için
, __faststorefence belgeleri diyor ki: "Teminatlar her önceki mağaza sonraki herhangi mağazada önce küresel görünür olduğunu." "Yük ve mağaza hafıza referanslar hem dahil olmak üzere her bir önceki hafıza referans, müteakip bellek referansı önce küresel görünür olduğunu Garantiler." :

MSVC 2008 ve 2010 için, değişti

İkincisinin yazılma biçimi, bunun, CPU'nun eski depolardan önce yüklerin yeniden sıralanmasını da engelleyeceğini ima ediyor. Bu ilk tanımdan farklıdır, ki bu da içsel olanın yalnızca eski mağazalarla zamansız depoların engellenmesi ya da yeniden düzenlenmesi ile uğraşmak anlamına geldiğine işaret eder (x86 (-64) sayılı tek yeniden sıralama).

Ancak daha sonra belgeleri kendisini çelişiyor gibi görünmektedir: "x64 platformunda, bu rutin sfence talimat daha hızlı bir mağaza çit olan bir talimatı üretir x64 platformunda yerine _mm_sfence bu içsel kullanın. ." Bu, hala sfence benzeri bir işlevselliğe sahip olduğu anlamına gelir ve bu nedenle yükler eski depolarla yeniden düzenlenebileceğini ima eder. Peki bu hangisi? Birisi benim karışıklığımı temizleyebilir mi?

PS: Bu işlevin GCC sürümünü arıyorsanız, long local; __asm__ __volatile__("lock; orl $0, %0;" : : "m"(local)); numaralı telefondan karşılıyorum ama sanırım 32-bit kodlu olduğunu; 64-bit analog ne olurdu?
__faststorefence'ın davranışı nedir?

+7

"__faststorefence" den daha iyi bir soru başlığı verebilir misiniz? –

+1

@JaredFarrish: Geç olması hiç olmamasından iyidir mi? :) – GManNickG

cevap

2

Aldığınız GCC sürümü, MSVC'nin ürettiği kodla eşdeğerdir. X86/x86-64 işlemci mimarisi belgelerinin, yüklerin ve depoların bir LOCK ed talimatı ile yeniden sıralanmadığını belirttiği gerçeğine güvenir.

Bunun geçici olmayan depolar için geçerli olup olmadığı net değil, çünkü genel olarak bellek modeli kısıtlamaları bu yönergeler için geçerli değildir.

+0

Merhaba Anthony, cevap için teşekkürler. Açık olan şey, bu içsel dokümantasyonun neden 32 ve 64'den ziyade x64 platformunda daha hızlı olduğunu belirlemesidir. Kilitli bir komutun sadece x86-64'te bir mfence daha ucuz olduğunu ima etmek anlamına mı geliyor? Ayrıca, hem yüklerin hem de depoların yeniden sipariş edilmesini önlerse, bu, sıralı tutarlılık için yeterli bir çittir (zamansız mağazaların durumu hariç)? –

+1

Bu intrinsik sadece x86-64 üzerinde MSVC'de mevcuttur; Nedenini bilmiyorum. Mimarinin temelde aynı olduğu için x86-64'te x86'da "MFENCE" ile aynı maliyeti elde etmesini beklerdim. Geçici olmayan mağazaları görmezden gelirseniz, bu sıralı tutarlılık için yeterli bir çittir. –