NUMA ehk Non-Uniform Memory Access on arvuti mälu disain, kus mälule juurdepääsu aeg sõltub mälu asukohast protsessori suhtes. Enamasti kasutatakse seda multitöötluses, näiteks serverites ja kõrgjõudlusega arvutites (HPC), kus ühes süsteemis võib olla kaks või enam protsessorit. NUMA-t kasutavas süsteemis pääseb protsessor kiiremini ligi enda lokaalsele mälule kui talle mittelokaalsetele (s.t jagatud või teiste protsessorite lokaalsetele) mäludele.
NUMA arhitektuur on muutunud oluliseks kaasaegsete mitmetuumaliste ja mitme protsessoriga süsteemide juures, kuna see võimaldab vältida traditsioonilise UMA (Uniform Memory Access) arhitektuuri kitsaskohti. NUMA eesmärk on parandada süsteemi skaleeritavust, vähendada mälusiini koormust ja tagada, et protsessorid saaksid töötada võimalikult väikese latentsusega.
NUMA arhitektuuris jagatakse süsteem mitmeks sõlmeks (ingl k node), millest igaüks sisaldab protsessorituumasid, mälukanaleid ja lokaalset füüsilist mälu. Erinevalt UMA süsteemidest, kus kõik protsessorid kasutavad ühist mälusiini, on NUMA eesmärk tuua mälu arvutusüksustele füüsiliselt lähemale, et vähendada latentsust ja suurendada mälu ribalaiust.
NUMA sõlmed on omavahel ühendatud spetsiaalselte interconnect-tehnoloogiatega - Intel QPI/UPI, AMD HyperTransport, AMD Infinity Fabric), mis võimaldavad protsessoritel vajadusel pääseda ligi ka teiste sõlmede mälule. Kuigi kogu süsteemi mälu on loogiliselt ühtne, ei ole see füüsiliselt homogeenne - ligipääs lokaaalsele mälule on oluliselt kiirem kui kaugmälu kasutamine.
NUMA süsteemi keskne ehitusüksus on sõlm, mis koosneb tavaliselt ühest või mitmest protsessorituumast, lokaalsest DRAM mälust, mälukontrollerist ja interconnect-liidestest teiste sõlmede suunas. Kaasaegsetes serveriprotsessorites on iga protsessoripakett jagatud mitmeks siemiseks NUMA domeeniks, kus igal domeenil on oma mälukanalid ja vahemäluhierarhia. See tähendab, et isegi ühe protsessori sees võib olla mitu NUMA sõlme.
NUMA arhitektuuris on mälukontrollerid enamasti integreeritud otse protsessorisse. See on oluline erinevus võrreldes UMA süsteemidega, kus mälukontroller oli eraldi kiibil. Integreeritud mälukontroller võimaldab madalamat latentsust, suuremat ribalaiust, otsest kontrolli mälupaigutuse üle ja loomulikku sõlmepõhist mälustruktuuri. Igal sõlmel on oma mälukanalid, mis toimivad sõltumatult teistest sõlmedest. See tähendab, et süsteemi koguribalaius kasvab koos sõlmede arvuga.

Sõlmede omavaheline ühendus on NUMA toimimise seisukohalt kriitiline. Interconnect peab tagama piisava ribalaiuse, madala latentsuse, ühtlusprotokollide tõhusa toimimise ning olema skaleeritav kümnete või sadade sõlmedeni. Interconnect'i kvaliteet määrab, kui suur on latentsuse erinevus lokaalse ja kaugmälu vahel.
Levinud interconnect topoloogiad on ring, mesh (võrgustik), crossbar (ristlatt) ja torus (toor). Ring on neist kõige lihtsam, kuid sõlmede arvu suurenedes kasvab latentsus, mesh'i puhul ühendub iga sõlm mitme naabriga, see on ka levinuim topoloogia. Crossbar topoloogias ühendub iga sõlm kõigiga, tegemist on väga kiire interconnect'iga, aga on ka väga kallis. HPC süsteemides, kus on vaja väga suurt skaleeritavust kasutatakse aga torus topoloogiat.
NUMA süsteemides on vahemäluhierarhia eriti oluline, sest see aitab vähendada vajadust kaugmälu järele. Tüüpilise vahemälu hierarhia kohaselt on vahemälu NUMA süsteemis jaotatud tasemeteks:
Vahemälude ühtsust tagavad protokollid (MESI, MOESI, MESIF) peavad töötama üle interconnect-võrgu, mis muudab ühtsuse tagamise NUMA süsteemides keerukamaks kui UMA's.
NUMA arhitektuur pakub mitmeid eeliseid:
NUMA-l on ka mõned puudused:
NUMA juured ulatuvad 1980.-1990. aastatesse, mil hakati otsima lahendusi mitme protsessoriga süsteemide skaleeritavuse parandamiseks. Varasemad süsteemid kasutasid peamiselt UMA arhitektuuri, kuid protsessorite arvu kasvades muutus ühine mälusiin kitsaskohaks. Selle tulemusena hakkasid teadlased ja arvutitootjad otsima viise, kuidas vähendada mälusiini koormust ja pakkuda paralleelsust.

NUMA arhitektuuri varajaseks eelkäijaks peetakse BBN Butterfly süsteemi, mis kasutas hajutatud mälu ja mitmetasandilist lülitusvõrku, et võimaldada protsessoritele ligipääsu nii lokaalsele kui ka kaugmälule. Süsteem ei olnud täiuslik, kuid see demonstreeris, et mälule ligipääsu latentsust saab vähendada, kui mälu jaotada füüsiliselt mitme sõlme vahel. Teine oluline varajane süsteem oli Encore Multimax, mis kasutas jagatud mälu, vahemälu ühtsuse mehhanisme ja võimaldas mitme protsessoriga töökoormusi paremini skaleerida kui traditsioonilised UMA masinad.
1990. aastatel toimus oluline läbimurre: cache-coherent NUMA arhitektuuride teke. Need süsteemid tagasid, et kõik protsessorid näevad ühtset mälupilti, isegi kui andmed asuvad erinevates vahemäludes. See lahendas ühe varasemate NUMA-süsteemide suurima probleemi - vahemälude järjekindlusetuse.
Kõige mõjukam ccNUMA süsteem oli Silicon Graphics Origin 2000, mis kasutas kataloogipõhist ühtsusprotokolli ja NUMAlink tehnoloogiat. Origin 2000 võimaldas süsteeme skaleerida sadade protsessoriteni, säilitades samal ajal mälu ühtluse ja suhteliselt madala latentsuse.

Samal perioodil ilmus ka Sequent NUMA-Q, mis oli üks esimesi kommertslikke ccNUMA servereid.
2000ndatel muutus NUMA serveriarhitektuuride standardiks. Aastal 2003 ilmus AMD Opteron, mis oli esimene x86 protsessor, mis integreeris mälukontrolleri protsessorisse ja kasutas HyperTransport-põhist NUMA ühendust. Inteli vastus sellele tuli aastal 2008 Intel Nehalem näol, mis oli esimene Intel Xeon arhitektuuri põhine protsessor, mis kasutas QuickPath Interconnect (QPI) tehnoloogiat ja NUMA-laadset mälumudelit.
Aastal 2017 tõi AMD turule EPYC serveriprotsessorid, mis kasutasid mitmest kiibist koosnevat chiplet-arhitektuuri. Iga chiplet oli omaette NUMA sõlm, ühendatud Infinity Fabricu kaudu teistega. See lähenemine võimaldas protsessorituumade arvu suurendada, säilitades samal ajal mälu ribalaiuse ja hoida latentsus kontrolli all. Intel vastas Xeon Scalable platvormiga, mis kasutas UPI (Ultra Path Interconnect) tehnoloogiat ja mitut mälukanalit sõlme kohta.
ccNUMA (cache-coherent NUMA) on NUMA arhitektuuri edasiarendus, mille keskne eesmärk on tagada vahemälu ühtsus kõigi protsessorite vahel sõltumata sellest, millises sõlmes andmed füüsiliselt asuvad. Kui klassikalises NUMA süsteemis võib iga sõlm hallata oma mälu sõltumatult, siis ccNUMA tagab, et kõik protsessorid näeksid ühtset ja järjekindlat mälupilti. See muudab ccNUMA-st sobiliku arhitektuuri üldotstarbelistele serveritele, andmebaasidele ja HPC rakendustele, kus programmide korrektsus sõltub mälupildist.
ccNUMA toimimise keskmes on ühtsusprotokollid, mis tagavad, et protsessorite vahemälud ei sisalda üksteisega vastuolus olevaid andmeid. Kõige levinumad protokollid on MESIF (Modified, Exclusive, Shared, Invalid, Forward), mis on kasutusel Intel Xeon platvormidel ning MOESI (Modified, Owned, Exclusive, Shared, Invalid), mis on kasutusel AMD serveriprotsessorites. Need protokollid määravad, millal andmeid uuendatakse ja millal need tuleb teistele sõlmedele edastada. Ühtsusprotokollid peavad töötama üle interconnect-võrgu, mis muudab ccNUMA oluliselt keerukamaks, kui UMA süsteemid, kus kõik vahemälud kuulavad ühte ühist siini.
Andmete edastamiseks ccNUMA süsteemides on kaks põhilist lähenemist: siini pealtkuulamist (ingl k bus snooping) ning kataloogipõhist ühtsust (ingl k directory-based coherence). Siini pealtkuulamise puhul jälgib iga vahemälu siini peal toimuvaid operatsioone ning uuendab enda sisu vastavalt. Selline lähenemine sobib väiksematele süsteemidele, kus sõlmede ja ühenduste arv on väike. Suuremate süsteemide puhul läheks pealtkuulamise jaoks vajalike ühenduste tegemine liiga kalliks ja latentsus suureneks.
Kataloogiipõhise ühtsuse puhul on iga sõlme juures eraldi kataloog, kus iga mälulehekülje või vahemälu rea kohta hoitakse kirjet, mis näitab, millistes vahemäludes andmed asuvad. Selline lähenemine vähendab suhtlusvõrgu koormust, kuna sõlmed suhtlevad ainult siis, kui see on vajalik. Selline lähenemine on suurtele süsteemidele kõige sobivaim ja on ühtlasi ka tänapäeva ccNUMA standard.
ccNUMA sõlm sisaldab protsessorituuma(sid), mitmetasandilist vahemälu, mälukontrollerid, interconnect-liideseid ja ühtsuskontrollerit. Ühtsuskontroller on ccNUMA eripära, see haldab vahemäludevahelist suhtlust ja tagab, et andmete olekud oleksid kooskõlas. Mõnes süsteemis, näiteks Intel Xeon, on see integreeeritud vahemällu, teistes, näiteks AMD EPYC, on see osa interconnect loogikast.
Lisaks ühtsusele peab ccNUMA tagama mälu järjepidevuse, seda tehakse reeglitega, mis määravad, millises järjekorras protsessorid mälukirjeid näevad. Levinuimad mudelid on TSO (Total Store Order), RC (Relaxed Consistency) ja SC (Sequential Consistency). Kuivõrd TSO ja RC on kasutuses levinud (Intel kasutab TSO-d ning ARM ja POWER põhised serverid RC-d), siis SC näol on tegemist teoreetilise ideaaliga, mida täies mahus rakendada on raske.
ccNUMA eelisteks on ühtse mäluruumi olemasolu, mis lihtsustab programmeerimist; skaleeritavust, mis muudab selle sobivaks suurtele serveritele ja HPC süsteemidele ning tõhus vahemälu kasutus, mis vähendab kaugmälu kasutamise vajadust. Puudusteks on ühtsusprotokollide keerukus, mis on suur riist- ja tarkvaraline lisakulu ning koormus interconnect-süsteemile, sest ühtsussõnumid võivad teatud hetkedel hõivata suure osa liiklusest.