Uçucu pahalı? | Netgez.com
SORU
8 Ocak 2011, CUMARTESÄ°


Uçucu pahalı?

Uçucu uygulanması hakkında The JSR-133 Cookbook for Compiler Writers okuduktan sonra, özellikle bölüm "Atom Talimatları ile Etkileşimleri" bir LoadLoad veya LoadStore bir bariyer ihtiyacı güncellemeden geçici bir değişken okuma. sanırım Bu sayfa daha aşağı LoadLoad ve LoadStore etkili hiçbir harekat x 86 İşlemciler üzerinde olduğunu görüyorum. Bu uçucu okuma işlemleri 86, ve hızlı, normal bir değişken okumak (uçucu olan yeniden düzenleme kısıtlamaları göz ardı ederek) açık önbellek geçersiz kılma olmadan yapılabilir anlamına mı geliyor?

Bu doğru anlamıyorum inanıyorum. Birisi bana aydınlatmak için olabilir mi?

EDİT: eğer işlemci çoklu ortamlarda farklılıklar olup olmadığını merak ediyorum. Tek CPU sistemleri CPU olabilir bak kendi iplik zula olarak John V. Birleşik Devletleri, ama çoklu İŞLEMCİ sistemleri olmalı yapılandırma seçeneği için CPU bu yeterli değildir ve ana bellek olmalı vurdu, yapma uçucu yavaş üzerinde çoklu işlemci sistemleri, değil mi?

Yolumu aşağıdaki harika makaleler hakkında rastladım bu, ve bu soruyu başkaları için ilginç olabilir bu yana, benim bağlantıları burada paylaşacağım: hakkında daha fazla bilgi edinmek PS:

CEVAP
8 Ocak 2011, CUMARTESÄ°


Intel BM içerikli uçucu bir okuyun oldukça ucuz. Eğer aşağıdaki gibi basit bir durumda olursak:

public static long l;

public static void run() {        
    if (l == -1)
        System.exit(-1);

    if (l == -2)
        System.exit(-1);
}

7 yeteneği Java yazdırma derleme kod çalışma yöntemini kullanmak gibi bir şey:

# {method} 'run2' '()V' in 'Test2'
#           [sp 0x10]  (sp of caller)
0xb396ce80: mov    êx,-0x3000(%esp)
0xb396ce87: push   ëp
0xb396ce88: sub    $0x8,%esp          ;*synchronization entry
                                    ; - Test2::run2@-1 (line 33)
0xb396ce8e: mov    $0xffffffff,ìx
0xb396ce93: mov    $0xffffffff,ëx
0xb396ce98: mov    $0x6fa2b2f0,%esi   ;   {oop('Test2')}
0xb396ce9d: mov    0x150(%esi),ëp
0xb396cea3: mov    0x154(%esi),íi   ;*getstatic l
                                    ; - Test2::run@0 (line 33)
0xb396cea9: cmp    ìx,ëp
0xb396ceab: jne    0xb396ceaf
0xb396cead: cmp    ëx,íi
0xb396ceaf: je     0xb396cece         ;*getstatic l
                                    ; - Test2::run@14 (line 37)
0xb396ceb1: mov    $0xfffffffe,ìx
0xb396ceb6: mov    $0xffffffff,ëx
0xb396cebb: cmp    ìx,ëp
0xb396cebd: jne    0xb396cec1
0xb396cebf: cmp    ëx,íi
0xb396cec1: je     0xb396ceeb         ;*return
                                    ; - Test2::run@28 (line 40)
0xb396cec3: add    $0x8,%esp
0xb396cec6: pop    ëp
0xb396cec7: test   êx,0xb7732000    ;   {poll_return}
;... lines removed

Bakarsanız 2 başvuruları için getstatic, ilk içerir bir yük bellek, ikinci atlar yük olarak değeri yeniden gelen kayıt(lar) önceden yüklenmiş (uzun 64 bit ve 32 bit laptop kullanıyor 2 kaydeder).

Eğer l değişken değişken yaparsak oluşturulan derleme farklıdır.

# {method} 'run2' '()V' in 'Test2'
#           [sp 0x10]  (sp of caller)
0xb3ab9340: mov    êx,-0x3000(%esp)
0xb3ab9347: push   ëp
0xb3ab9348: sub    $0x8,%esp          ;*synchronization entry
                                    ; - Test2::run2@-1 (line 32)
0xb3ab934e: mov    $0xffffffff,ìx
0xb3ab9353: mov    $0xffffffff,ëx
0xb3ab9358: mov    $0x150,ëp
0xb3ab935d: movsd  0x6fb7b2f0(ëp),%xmm0  ;   {oop('Test2')}
0xb3ab9365: movd   %xmm0,êx
0xb3ab9369: psrlq  $0x20,%xmm0
0xb3ab936e: movd   %xmm0,íx         ;*getstatic l
                                    ; - Test2::run@0 (line 32)
0xb3ab9372: cmp    ìx,êx
0xb3ab9374: jne    0xb3ab9378
0xb3ab9376: cmp    ëx,íx
0xb3ab9378: je     0xb3ab93ac
0xb3ab937a: mov    $0xfffffffe,ìx
0xb3ab937f: mov    $0xffffffff,ëx
0xb3ab9384: movsd  0x6fb7b2f0(ëp),%xmm0  ;   {oop('Test2')}
0xb3ab938c: movd   %xmm0,ëp
0xb3ab9390: psrlq  $0x20,%xmm0
0xb3ab9395: movd   %xmm0,íi         ;*getstatic l
                                    ; - Test2::run@14 (line 36)
0xb3ab9399: cmp    ìx,ëp
0xb3ab939b: jne    0xb3ab939f
0xb3ab939d: cmp    ëx,íi
0xb3ab939f: je     0xb3ab93ba         ;*return
;... lines removed

Bu durumda getstatic her iki deÄŸiÅŸken l baÅŸvurular bellekten bir yük içerir, yani deÄŸeri birden çok uçucu okur arasında bir kayıt tutulabilir. Emin olmak için orada bir atom okumak deÄŸerdir okuma ana belleÄŸe bir kayıt YAZILIMI movsd 0x6fb7b2f0(ëp),%xmm0 okuma iÅŸlemi tek bir talimat (önceki örnekte gördüğümüz 64-bit deÄŸeri normalde gerektiren iki 32 bit okur üzerinde bir 32-bit sistem).

Uçucu bir okuma maliyetini kabaca eşdeğer bir bellek yükü ve L1 önbellek erişim kadar ucuz olabilir. Eğer başka bir çekirdek önbellek satırı geçersiz olacak değişken değişken için, bir ana bellek veya L3 önbellek erişim gerektiren belki de yazılı ise. Gerçek maliyeti ağır İŞLEMCİ mimarisi bağlıdır. Hatta Intel ve AMD arasında önbellek tutarlılık protokolleri farklıdır.

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VÄ°DEO

Rastgele Yazarlar

  • Brandon McCrary

    Brandon McCr

    15 Ocak 2012
  • InfinityWard

    InfinityWard

    19 EYLÃœL 2006
  • Jonathan D.

    Jonathan D.

    3 Kasım 2006