Atomun istismar dəyəri

Bir atom əməliyyatının dəyəri (müqayisə və dəyişdirmə və ya atom əlavə / azaldılması istənilən) hansıdır? Neçə dövr istehlak edir? SMP və ya NUMA-da digər prosessorları dayandırmaq və ya yaddaşa giriş imkanını məhdudlaşdırırmı? Sifariş prosessorunun xaricində yenidən sifariş tamponunun yenidən qurulmasına kömək edəcəkmi?

Önbellekte hansı effektlər olacaq?

Mən müasir populyar prosessorlar ilə maraqlanıram: x86, x86_64, PowerPC, SPARC, Itanium.

65
29 марта '10 в 16:11 2010-03-29 16:11 osgx 29 Mart 'da saat 16:11' də təyin olundu
@ 3 cavab

Son günlərdə faktiki məlumatları aradım və heç bir şey tapmadım. Ancaq, atom əməliyyatlarının xərclərini önbellektəki qiymətləri ilə müqayisə edən bir araşdırma etdim.

PentiumPro üçün x86 LOCK və ya CAS prefiksinin dəyəri (sənəddə təsvir olunduğu kimi) yaddaşa giriş (məsələn, cache pass), + digər prosessorların yaddaş əməliyyatları dayandırılması + avtobusa mane olan digər prosessorlar ilə hər hansı bir münaqişə. Lakin, PentiumPro bütün yaddaş əməliyyatlarının bağlanması əvəzinə yalnız müvafiq dövr blokirovka edildikdən sonra (məsələn, hardware ilə əlaqə saxlamırsanız, tətbiqin bütün yaddaşı yaddaşa yazma yaddaşına (yəni cacheable) yuxarıda).

Əslində, CAS işi bu səhifədə təsvir edildiyi kimi daha mürəkkəb ola bilər, lakin vaxtları yox, etibarlı bir mühəndisin dərin təsviri.

Çox detalına girməzdən öncə demək istəyirəm ki, LOCKED əməliyyatı cachedə bir missi tələb edir + eyni caching xəttində başqa bir prosessor ilə mümkün anlaşılmazlıq olsa da, CAS + əvvəlki yükdür (demək olar ki, həmişə tələb olunur, mutexes istisna olmaqla Siz həmişə CAS 0 və 1) iki cache misses başa bilər.

Bir yerdə + CAS yüklənməsini yüklə bağlı / Mağaza-şərtli (sonun üçün bax) kimi iki cache misses başa bilər izah edir. Onun izahatı MESI önbellek müzakirə protokolunun məlumatına əsaslanır. Keçid üçün 4 dövlət istifadə edir: zəruri hallarda aşağıda izah edilən M (səlahiyyətli), E (xclusive), S (hared), I (nvalid) (və, buna görə də, MESI). Təqdim olunan skript aşağıdakı kimidir:

  • YÜK bir önbellekti əldən verməyə səbəb olur - müvafiq cacheline ümumi haldakı yaddaşdan yüklənmişdir (yəni, digər protsessorlar hələ də bu cashew-ni yaddaşda saxlamağa icazə verilir, bu hallarda heç bir dəyişiklik icazə verilmir). Yeri yaddaşda olsa, bu cache eksik. Mümkün qiymət: 1 pul slip. (önbellek Paylaşılan, Eksklüziv və ya Modifikasiya edilmişsə, yəni bu L1 CPU önbellekindedir).
  • proqram, saxlanması üçün yeni dəyərləri hesablayır,
  • və atom CAS talimatına başlayır.
    • Paralel modifikasiyadan qaçınmaq lazımdır, belə ki, cashew-ni xüsusi vəziyyətə keçirmək üçün digər prosessorların önbelleğinin önbelleğinin kopyalarını çıxarmaq lazımdır. Mümkün qiymət: 1 cache səhv. Bu, artıq müstəqil olsa, yəni müstəsna və ya dəyişdirilmiş vəziyyətdə olması zəruridir. Hər iki dövlətdə, digər CPU'lar naqd ödəməyə dəstək vermir, lakin Qeyri-adi vəziyyətdə hələ də dəyişməyib.
    • Bu mesajdan sonra, yerli prosessor önbelleğimizde dəyişən dəyişir və bu nöqtədə bütün digər CPU'lara (onların önbellekleri bizimlə tutarlı olduğundan) görünür. Nəticədə ənənəvi alqoritmlərə əsasən ana yaddaşa yazılacaq.
    • Bu dəyişənə oxumaq və ya dəyişdirmək istəyən digər prosessorlar ilk növbədə bu cashew-ni paylaşılan və ya xüsusi istifadə rejimində əldə etməlidirlər və bunun üçün bu prosessorla əlaqə saxlayacaqlar və caching-in yenilənmiş bir versiyasını əldə edəcəklər. Bunun əvəzinə, LOCKED əməliyyatı yalnız buraxılmış önbelleğe mal ola bilər (çünki gəlin birbaşa müstəsna hallarda tələb olunacaq).

Bütün hallarda, önbelleğe alma tələbi data dəyişdirən digər prosessorlar tərəfindən dayandırıla bilər.

47
06 мая '10 в 22:50 2010-05-06 22:50 Cavab Blaisorblade tərəfindən 06.05.10 10:50 da verilir 2010-05-06 22:50

Aşağıdakı ayarı ilə bəzi profilləri çəkdim: test maşını (AMD Athlon64 x2 3800+) yükləndi, uzun bir rejimə keçdi (interruptlar aradan qaldırıldı) və maraqlı bir komanda bir loopda icra edildi, 100 iterasiya yerləşdirildi və 1000 dövrə looped. Döngənin cəsədi 16 bayt ilə hizalanmışdır. Saat, dövrdən əvvəl və sonra rdtsc əmri ilə ölçüldü. Bundan əlavə, bir dummy loop heç bir göstəriş olmadan həyata keçirilmişdir (dövriyyənin təkrarlanması üçün 2 dövr və digər dövr üçün 14 dövrə ölçülmüşdür) və nəticənin komanda vaxtının nəticəsindən çıxarılıb.

Aşağıdakı təlimatlar ölçüldü:

  • " lock cmpxchg [rsp - 8], rdx " (həm uyğunluq və uyğunsuzluq),
  • " lock xadd [rsp - 8], rdx ",
  • " lock bts qword ptr [rsp - 8], 1 "

Bütün hallarda, ölçülmə müddəti təxminən 310 dövrə idi, səhv +/- 8 dövrü idi

Bu dəyər eyni (yaddaşlı) yaddaşda təkrar icra etmək üçündür. Əlavə bir ön pass keçid ilə vaxt çox yüksəkdir. Ayrıca, bu, yalnız iki çekirdekten yalnız biri ilə yapıldı, belə ki, önbellek yalnız mülk sahibidir və heç bir önbellek senkronizasyonu tələb olunmur.

border=0

Bir önbelleği wbinvld bloklanmış bir təlimatın dəyərini qiymətləndirmək üçün bloklanmış təlimat əvvəl bir wbinvld təlimat əlavə və wbinvld plus bir add [rsp - 8], rax müqayisəli loop daxil add [rsp - 8], rax . Her iki durumda da, maliyet talimatları cüt başına təxminən 80,000 dövrə idi! BTS-nin bloklanması vəziyyətində, vaxt fərqi hər təlim üçün 180 dövrə idi.

Bu tərs bant genişliyi olduğuna diqqət yetirin, lakin bloklama əməliyyatları serializasiya əməliyyatları yerinə yetirildikdən sonra gecikmələrdə heç bir fərq yoxdur.

Sonuç: Engellenen bir əməliyyat ağırdır, ancaq bir önbellek miss daha çətin ola bilər. Həmçinin: bloklanmış bir əməliyyat, önbellekteki boşluqlara səbəb olmaz. Bu, kassa yalnız sinonimə aid olmadığında yalnız sinxronizasiya trafikinə gətirib çıxara bilər.

Makineyi açmaq üçün, FreeLdr x64 versiyasını ReactOS layihəsindən istifadə etdim. Burada asm mənbə kodu:

 #define LOOP_COUNT 1000 #define UNROLLED_COUNT 100 PUBLIC ProfileDummy ProfileDummy: cli // Get current TSC value into r8 rdtsc mov r8, rdx shl r8, 32 or r8, rax mov rcx, LOOP_COUNT jmp looper1 .align 16 looper1: REPEAT UNROLLED_COUNT // nothing, or add something to compare against ENDR dec rcx jnz looper1 // Put new TSC minus old TSC into rax rdtsc shl rdx, 32 or rax, rdx sub rax, r8 ret PUBLIC ProfileFunction ProfileFunction: cli rdtsc mov r8, rdx shl r8, 32 or r8, rax mov rcx, LOOP_COUNT jmp looper2 .align 16 looper2: REPEAT UNROLLED_COUNT // Put here the code you want to profile // make sure it doesn't mess up non-volatiles or r8 lock bts qword ptr [rsp - 8], 1 ENDR dec rcx jnz looper2 rdtsc shl rdx, 32 or rax, rdx sub rax, r8 ret 
29
21 апр. Cavab Timo tərəfindən 21 aprel tarixində verilir. 2013-04-21 18:04 '13 at 18:04 2013-04-21 18:04