Interviu: continuare
Dar mă întrebam dacă aș putea prinde acest efect în realitate. Realitatea, ca de obicei, sa dovedit a fi un pic teorie mai complicat, dar creierul este învins din nou în creier și un meci de calculator: acest cod de la baza (atent selectate) va produce în modul sincron (-Dasync = false) (690 +/- 1%) ns / mesaj și în asincron (560 +/- 8%) ns / mesaj.
Aș vrea să înțeleg în termeni generali ce spune străinul despre ce se întâmplă acolo?
Avem nevoie pentru a ridica unele sarcini mari consumatoare de memorie convențională și rupe-l în două faze, fiecare dintre acestea se referă la piesele sale de date. Am luat bucata de date sub forma unui suficient de mare (comparabil cu mărimea L1) matrice de dublu []. "Faza de prelucrare a mesajului" în sine constă în mai multe citiri / intrări în celulele acestei matrice. "Multiple" este ales să fie 128, 128 și aceste celule sunt selectate din intreaga gama de algoritm pseudoaleator (tip LCG: I = (A * I) Mod C). În primul rând, prima fază de a face-o pe matrice lor, apoi a doua fază face exact același lucru pe ea - și așa mai departe pentru fiecare mesaj, din care legiunii 1 milion fiecare rundă. Da, ceea ce codul dictez:
Interesantă întrebare numărul 1: dacă o săritură pseudo-aleatoare în jurul unei matrice este înlocuită de o rulare cu un pas fix, atunci diferența de performanță dispare practic. Mai degrabă, chiar și cu o marjă mică, aproape la limita erorii, opțiunea sincronă începe să câștige. De ce este așa? Interesantă întrebare numărul 2: dacă lăsăm la o parte opțiunea considerată - ce alte efecte pot oferi un avantaj versiunii "paralelizate" a codului secvențial? P.S. Da, apropo - noi (Deutsche Bank) recrutăm oameni. Se pare că 3-4 posturi vacante sunt acum deschise. Îmi puteți scrie direct și încă mai am multe idei interesante pentru interviu :)
Răspunsul la întrebarea nr. 1: activarea prefetării este activată. Faptul este că dacă ne rătăceam accidental printr-o matrice, probabilitatea unei pierderi de cache depinde de dimensiunea cache-ului.
Dacă este activată prefetarea, lipsele cache-ului sunt practic absente.
Da, exact. Și ce se va întâmpla dacă schimbați dimensiunea pasului - de exemplu, dacă luați pasul 1, 8, 256?
Cred că dacă luați pasul 1 și 8, atunci prefetchul va porni, deoarece În acest caz, aceeași linie sau următoarea linie de cache va fi încărcată de fiecare dată, iar în cazul 256 nu va porni. nu va încărca următoarea linie cache, dar cu o trecere. Cu toate acestea, am auzit că există prefetchers care recunosc un pas constant, deci totul depinde de fierul specific.
În ceea ce privește a doua întrebare, îmi pot imagina o situație în care al doilea procesor este filetat, ceea ce împarte resursele cu sarcina noastră.
Da, în principiu este adevărat. Numai prefectatorul Intel recunoaște scanarea memoriei cu un pas constant de până la 2048 de octeți (se pare). Deci, cu un pas până la 256 * duble prefetting va funcționa.
Dar întrebarea foarte interesant (de data aceasta nu am știut încă răspunsul) de ce unii pași (de exemplu, 73, 81, 97, 105, 113, 121, 127, 129), o versiune asincronă a lucrării uneori mai lent (în 5- De 8 ori) decât cu restul? Sincronă aceeași opțiune, se pare, nu demonstrează acest efect.