Arquitectures paral·leles · 4.5
La política first touch
El sistema operatiu posa cada pàgina al node que la toca primer. Per això, en NUMA, inicialitzar les dades en paral·lel les reparteix entre nodes i millora la localitat.
Conceptes clau
- Política first touch
- Home node a nivell de pàgina
- Inicialització seqüencial vs paral·lela
- Snooping dins del node, directori entre nodes
Cada quadre és una pàgina de memòria, al node on l'ha posada el first touch. Plena: la fa servir un fil del mateix node. Ratllada: la fa servir un fil de l'altre node (accés remot).
Ara que sabem que en NUMA l’accés a memòria remota és més costós i que el directori genera tràfic de coherència per cada accés, la pregunta natural és: qui decideix a quin node resideix cada dada?
El sistema operatiu decideix el home node a nivell de pàgina amb la política first touch: el primer node que accedeix (toca) una pàgina fa que aquesta quedi assignada a la seva memòria. Això té una conseqüència directa per al programador:
Inicialització seqüencial (dolenta en NUMA):
for (int i = 0; i < N; i++) {
a[i] = random();
b[i] = random();
}
// Tots els vectors queden al·locats en un UNIC node (M0)
Inicialització paral·lela (bona en NUMA):
#pragma omp parallel num_threads(4)
{
int myid = omp_get_thread_num();
int BS = N / omp_get_num_threads();
for (int i = myid * BS; i < (myid + 1) * BS; i++) {
a[i] = random();
b[i] = random();
}
}
// Vectors DISTRIBUITS entre MC0, MC1, MC2 i MC3
Aquesta observació és el punt de partida del tema següent (descomposició de dades): no n’hi ha prou amb repartir la feina entre threads, cal repartir estratègicament les dades per maximitzar la localitat.
Snooping i directori alhora
És habitual una solució híbrida: dins d’un node es manté coherència amb snooping perquè el nombre d’agents és relativament petit i la interconnexió interna ho permet; entre nodes, la coherència es manté amb directoris. En aquest esquema, el hub del node actua com un agent que coordina el que passa dins del node i interactua amb els home nodes (directoris) quan cal coherència entre nodes.
Arquitectura NUMA amb dos nodes (2 cores/node). La memòria local de cada node (MM) emmagatzema, per a cada línia, els bits de directori: estat MSU (2 bits) i presence bits (1 bit/node). El directori és distribuït entre les MM. Cada caché conté els seus propis bits de coherència (CB, 2 bits en MSI). Dins del node la coherència es manté per snooping; entre nodes, el directori envia missatges punt a punt només als nodes indicats pels presence bits. (figura al dossier, p. 17)