<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.haidhi.my.id/wiki/index.php?action=history&amp;feed=atom&amp;title=NUMA</id>
	<title>NUMA - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.haidhi.my.id/wiki/index.php?action=history&amp;feed=atom&amp;title=NUMA"/>
	<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=NUMA&amp;action=history"/>
	<updated>2026-11-01T19:56:00Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=NUMA&amp;diff=754&amp;oldid=prev</id>
		<title>SanzSkuy: Created page with &quot;&#039;&#039;&#039;NUMA&#039;&#039;&#039; (&#039;&#039;&#039;Non-Uniform Memory Access&#039;&#039;&#039;) adalah arsitektur memori di mana &#039;&#039;&#039;waktu akses ke RAM tidak seragam&#039;&#039;&#039;: tergantung memorinya &quot;milik&quot; siapa. Setiap grup CPU (disebut &#039;&#039;&#039;NUMA node&#039;&#039;&#039;) punya RAM lokalnya sendiri yang cepat diakses; mengakses RAM milik node lain tetap bisa, tapi harus lewat interkoneksi antar-node sehingga lebih lambat.  NUMA adalah kenyataan sehari-hari di server multi-socket dan CPU chiplet modern (AMD EPYC, Xeon besar). Program yang mengangg...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=NUMA&amp;diff=754&amp;oldid=prev"/>
		<updated>2026-07-03T07:41:14Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;#039;&amp;#039;&amp;#039;NUMA&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;&amp;#039;Non-Uniform Memory Access&amp;#039;&amp;#039;&amp;#039;) adalah arsitektur memori di mana &amp;#039;&amp;#039;&amp;#039;waktu akses ke RAM tidak seragam&amp;#039;&amp;#039;&amp;#039;: tergantung memorinya &amp;quot;milik&amp;quot; siapa. Setiap grup CPU (disebut &amp;#039;&amp;#039;&amp;#039;NUMA node&amp;#039;&amp;#039;&amp;#039;) punya RAM lokalnya sendiri yang cepat diakses; mengakses RAM milik node lain tetap bisa, tapi harus lewat interkoneksi antar-node sehingga lebih lambat.  NUMA adalah kenyataan sehari-hari di server multi-socket dan CPU chiplet modern (AMD EPYC, Xeon besar). Program yang mengangg...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;NUMA&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;&amp;#039;Non-Uniform Memory Access&amp;#039;&amp;#039;&amp;#039;) adalah arsitektur memori di mana &amp;#039;&amp;#039;&amp;#039;waktu akses ke RAM tidak seragam&amp;#039;&amp;#039;&amp;#039;: tergantung memorinya &amp;quot;milik&amp;quot; siapa. Setiap grup CPU (disebut &amp;#039;&amp;#039;&amp;#039;NUMA node&amp;#039;&amp;#039;&amp;#039;) punya RAM lokalnya sendiri yang cepat diakses; mengakses RAM milik node lain tetap bisa, tapi harus lewat interkoneksi antar-node sehingga lebih lambat.&lt;br /&gt;
&lt;br /&gt;
NUMA adalah kenyataan sehari-hari di server multi-socket dan CPU chiplet modern (AMD EPYC, Xeon besar). Program yang menganggap &amp;quot;semua RAM sama saja&amp;quot; bisa kehilangan performa signifikan di mesin NUMA — bukan karena hitungannya lambat, tapi karena datanya &amp;quot;tinggal di rumah tetangga&amp;quot;. Bersama [[Cache line]] dan [[SoA vs AoS|layout data]], ini adalah fondasi ketiga dari optimasi memori di HPC.&lt;br /&gt;
&lt;br /&gt;
== Analogi Sederhana ==&lt;br /&gt;
&lt;br /&gt;
Bayangkan kantor dengan dua gedung. Tiap gedung punya tim sendiri &amp;#039;&amp;#039;&amp;#039;dan lemari arsipnya sendiri&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
* Tim A butuh dokumen yang ada di lemari gedungnya sendiri → tinggal jalan beberapa langkah. Cepat. Ini &amp;#039;&amp;#039;&amp;#039;akses lokal&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* Tim A butuh dokumen yang disimpan di gedung sebelah → harus nyeberang lewat jembatan penghubung, dan jembatan itu dipakai bareng-bareng. Lebih lama, dan kalau ramai bisa antre. Ini &amp;#039;&amp;#039;&amp;#039;akses remote&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Isi dokumennya sama saja — yang beda cuma &amp;#039;&amp;#039;&amp;#039;jaraknya&amp;#039;&amp;#039;&amp;#039;. Kunci performa di NUMA: usahakan tiap tim bekerja dengan arsip yang disimpan di gedungnya sendiri.&lt;br /&gt;
&lt;br /&gt;
== UMA vs NUMA ==&lt;br /&gt;
&lt;br /&gt;
Dulu, sistem multi-prosesor memakai model &amp;#039;&amp;#039;&amp;#039;UMA&amp;#039;&amp;#039;&amp;#039; (Uniform Memory Access / SMP): semua CPU berbagi satu bus ke satu memori.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UMA / SMP (model lama):&lt;br /&gt;
&lt;br /&gt;
  +-------+   +-------+   +-------+   +-------+&lt;br /&gt;
  | CPU 0 |   | CPU 1 |   | CPU 2 |   | CPU 3 |&lt;br /&gt;
  +---+---+   +---+---+   +---+---+   +---+---+&lt;br /&gt;
      |           |           |           |&lt;br /&gt;
  ====+===========+=====+=====+===========+====   &amp;lt;- SATU bus bersama&lt;br /&gt;
                        |&lt;br /&gt;
                  +-----+-----+&lt;br /&gt;
                  |    RAM    |&lt;br /&gt;
                  +-----------+&lt;br /&gt;
&lt;br /&gt;
  Masalah: makin banyak CPU, bus jadi rebutan.&lt;br /&gt;
  Tidak bisa di-scale.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Solusinya: pindahkan memory controller ke dalam tiap CPU, beri tiap CPU RAM-nya sendiri, lalu sambungkan antar-CPU dengan interkoneksi cepat (Intel: UPI, AMD: Infinity Fabric). Lahirlah NUMA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NUMA (2 node):&lt;br /&gt;
&lt;br /&gt;
        NODE 0                            NODE 1&lt;br /&gt;
+---------------------+          +---------------------+&lt;br /&gt;
|      Socket 0       |          |      Socket 1       |&lt;br /&gt;
|  core core core ... |          |  core core core ... |&lt;br /&gt;
|  [memory controller]|&amp;lt;========&amp;gt;|  [memory controller]|&lt;br /&gt;
+----------+----------+   UPI /  +----------+----------+&lt;br /&gt;
           |             Infinity           |&lt;br /&gt;
     +-----+-----+        Fabric      +-----+-----+&lt;br /&gt;
     | RAM lokal |                    | RAM lokal |&lt;br /&gt;
     |  node 0   |                    |  node 1   |&lt;br /&gt;
     +-----------+                    +-----------+&lt;br /&gt;
&lt;br /&gt;
Akses LOKAL  : core node 0 -&amp;gt; RAM node 0   (cepat, ~80-100 ns)&lt;br /&gt;
Akses REMOTE : core node 0 -&amp;gt; RAM node 1   (lewat interkoneksi,&lt;br /&gt;
                                            ~1.5-2x lebih lambat,&lt;br /&gt;
                                            bandwidth lebih kecil)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Rasio &amp;quot;berapa kali lebih lambat akses remote dibanding lokal&amp;quot; disebut &amp;#039;&amp;#039;&amp;#039;NUMA factor&amp;#039;&amp;#039;&amp;#039;, umumnya sekitar 1,5–2x untuk 2 socket, dan bisa lebih besar di sistem 4–8 socket.&lt;br /&gt;
&lt;br /&gt;
Catatan penting era sekarang: NUMA tidak selalu berarti multi-socket. CPU chiplet seperti &amp;#039;&amp;#039;&amp;#039;AMD EPYC&amp;#039;&amp;#039;&amp;#039; bisa dipecah jadi beberapa NUMA node &amp;#039;&amp;#039;&amp;#039;di dalam satu socket&amp;#039;&amp;#039;&amp;#039; (setting BIOS NPS1/NPS2/NPS4), dan Intel punya &amp;#039;&amp;#039;&amp;#039;Sub-NUMA Clustering (SNC)&amp;#039;&amp;#039;&amp;#039;. Laptop/desktop biasa umumnya cuma 1 node — jadi masalah ini baru terasa begitu kode pindah ke server.&lt;br /&gt;
&lt;br /&gt;
== Melihat Topologi NUMA ==&lt;br /&gt;
&lt;br /&gt;
Perintah paling penting: &amp;lt;code&amp;gt;numactl --hardware&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ numactl --hardware&lt;br /&gt;
available: 2 nodes (0-1)&lt;br /&gt;
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15&lt;br /&gt;
node 0 size: 64220 MB&lt;br /&gt;
node 0 free: 58109 MB&lt;br /&gt;
node 1 cpus: 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31&lt;br /&gt;
node 1 size: 64485 MB&lt;br /&gt;
node 1 free: 61022 MB&lt;br /&gt;
node distances:&lt;br /&gt;
node   0   1&lt;br /&gt;
  0:  10  21&lt;br /&gt;
  1:  21  10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cara membaca &amp;#039;&amp;#039;&amp;#039;matriks distance&amp;#039;&amp;#039;&amp;#039;: angka relatif, 10 = akses lokal. Nilai 21 artinya akses silang kira-kira 2,1x &amp;quot;lebih jauh&amp;quot; dari lokal. Alternatif lain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
lscpu | grep -i numa      # ringkasan node &amp;amp; CPU-nya&lt;br /&gt;
lstopo                    # gambar topologi lengkap (paket hwloc)&lt;br /&gt;
cat /sys/devices/system/node/node0/cpulist&lt;br /&gt;
numastat                  # statistik hit/miss alokasi per node&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;numa_hit&amp;lt;/code&amp;gt; vs &amp;lt;code&amp;gt;numa_foreign&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;other_node&amp;lt;/code&amp;gt; di &amp;lt;code&amp;gt;numastat&amp;lt;/code&amp;gt; adalah indikator cepat apakah programmu banyak makan akses remote.&lt;br /&gt;
&lt;br /&gt;
== First-Touch: Jebakan Paling Umum ==&lt;br /&gt;
&lt;br /&gt;
Di Linux, &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; &amp;#039;&amp;#039;&amp;#039;belum&amp;#039;&amp;#039;&amp;#039; menentukan halaman memori ditaruh di node mana. Kebijakan default-nya &amp;#039;&amp;#039;&amp;#039;first-touch&amp;#039;&amp;#039;&amp;#039;: halaman (page) fisik baru dialokasikan di node milik &amp;#039;&amp;#039;&amp;#039;thread yang pertama kali menyentuhnya&amp;#039;&amp;#039;&amp;#039; (menulisnya) — bukan yang meng-alokasikan.&lt;br /&gt;
&lt;br /&gt;
Konsekuensinya di kode OpenMP, ini jebakan klasik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
double *a = new double[N];        // belum ada page fisik&lt;br /&gt;
&lt;br /&gt;
// JEBAKAN: inisialisasi serial oleh thread utama (node 0)&lt;br /&gt;
for (long i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    a[i] = 0.0;                   // SEMUA page first-touch di node 0!&lt;br /&gt;
&lt;br /&gt;
#pragma omp parallel for schedule(static)&lt;br /&gt;
for (long i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    a[i] = kerja_berat(a[i]);     // thread di node 1 akses remote terus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Akibat init serial:&lt;br /&gt;
&lt;br /&gt;
RAM node 0 : [pg][pg][pg][pg][pg][pg][pg][pg]   &amp;lt;- semua di sini&lt;br /&gt;
RAM node 1 : (kosong)&lt;br /&gt;
&lt;br /&gt;
Saat fase paralel:&lt;br /&gt;
  thread node 0 --&amp;gt; lokal   (cepat)&lt;br /&gt;
  thread node 1 --&amp;gt; remote SEMUA, lewat interkoneksi (lambat),&lt;br /&gt;
                    plus memory controller node 0 jadi rebutan&lt;br /&gt;
                    oleh 2 node sekaligus (bandwidth mentok separuh)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Perbaikannya sederhana: &amp;#039;&amp;#039;&amp;#039;inisialisasi juga secara paralel, dengan pembagian kerja yang sama&amp;#039;&amp;#039;&amp;#039; dengan loop komputasinya — supaya tiap thread &amp;quot;menyentuh pertama&amp;quot; bagian data yang memang akan ia pakai:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// BENAR: first-touch paralel, pembagian identik (schedule(static))&lt;br /&gt;
#pragma omp parallel for schedule(static)&lt;br /&gt;
for (long i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    a[i] = 0.0;                   // page tersebar mengikuti thread&lt;br /&gt;
&lt;br /&gt;
#pragma omp parallel for schedule(static)&lt;br /&gt;
for (long i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    a[i] = kerja_berat(a[i]);     // mayoritas akses jadi lokal&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Supaya trik ini bekerja, thread tidak boleh pindah-pindah core antar node — makanya first-touch selalu dipasangkan dengan &amp;#039;&amp;#039;&amp;#039;pinning&amp;#039;&amp;#039;&amp;#039; (bagian berikut).&lt;br /&gt;
&lt;br /&gt;
== Pinning / Affinity ==&lt;br /&gt;
&lt;br /&gt;
Secara default OS bebas memindahkan thread antar core, termasuk nyeberang node — yang merusak lokalitas yang sudah susah payah diatur. Kunci thread/proses ke tempatnya:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;OpenMP:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export OMP_PROC_BIND=close        # atau spread&lt;br /&gt;
export OMP_PLACES=cores&lt;br /&gt;
./program&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;numactl (per proses):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
numactl --cpunodebind=0 --membind=0 ./program   # kunci CPU + RAM ke node 0&lt;br /&gt;
numactl --interleave=all ./program              # sebar page round-robin ke semua node&lt;br /&gt;
numastat -p $(pidof program)                    # audit: page-nya beneran di mana?&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;MPI (OpenMPI):&amp;#039;&amp;#039;&amp;#039; pola yang umum di cluster adalah satu rank per NUMA node, lalu OpenMP mengisi core di dalam node itu (hybrid MPI+OpenMP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mpirun --map-by numa --bind-to numa -np 2 ./program&lt;br /&gt;
# tiap rank &amp;quot;terkurung&amp;quot; di satu node -&amp;gt; semua alokasinya otomatis lokal&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ini salah satu alasan desain hybrid populer: MPI memaksa pemisahan memori antar rank, sehingga masalah NUMA hilang dengan sendirinya di level antar-node.&lt;br /&gt;
&lt;br /&gt;
== Kebijakan Alokasi Memori ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Kebijakan !! Perilaku !! Cocok untuk&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;default (first-touch)&amp;#039;&amp;#039;&amp;#039; || Page ditaruh di node thread yang pertama menyentuh || Kode yang init-nya sudah paralel &amp;amp; thread di-pin&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;bind&amp;#039;&amp;#039;&amp;#039; (&amp;lt;code&amp;gt;--membind&amp;lt;/code&amp;gt;) || Page dipaksa di node tertentu; gagal kalau penuh || Proses yang memang dikurung di satu node&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;preferred&amp;#039;&amp;#039;&amp;#039; || Coba node tertentu dulu, boleh meluber ke node lain || Mirip bind tapi tidak mau gagal alokasi&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;interleave&amp;#039;&amp;#039;&amp;#039; (&amp;lt;code&amp;gt;--interleave&amp;lt;/code&amp;gt;) || Page disebar bergilir ke semua node || Data besar yang diakses acak oleh semua thread (bandwidth dibagi rata, latency rata-rata)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Untuk kontrol dari dalam kode, ada &amp;#039;&amp;#039;&amp;#039;libnuma&amp;#039;&amp;#039;&amp;#039; (&amp;lt;code&amp;gt;numa_alloc_onnode()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mbind()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;move_pages()&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Kernel Linux juga punya &amp;#039;&amp;#039;&amp;#039;Automatic NUMA Balancing&amp;#039;&amp;#039;&amp;#039; (&amp;lt;code&amp;gt;/proc/sys/kernel/numa_balancing&amp;lt;/code&amp;gt;) yang diam-diam memigrasi page mendekati thread pemakainya. Kadang membantu, tapi untuk benchmark HPC yang sudah diatur manual biasanya justru dimatikan supaya hasilnya stabil.&lt;br /&gt;
&lt;br /&gt;
== Gejala Khas Masalah NUMA ==&lt;br /&gt;
&lt;br /&gt;
* Program scaling bagus sampai jumlah thread = 1 node, lalu &amp;#039;&amp;#039;&amp;#039;mendadak jelek&amp;#039;&amp;#039;&amp;#039; begitu meluber ke node kedua.&lt;br /&gt;
* Waktu eksekusi &amp;#039;&amp;#039;&amp;#039;tidak stabil&amp;#039;&amp;#039;&amp;#039; antar-run (kadang cepat kadang lambat, tergantung OS menaruh thread di mana).&lt;br /&gt;
* &amp;lt;code&amp;gt;numastat&amp;lt;/code&amp;gt; menunjukkan &amp;lt;code&amp;gt;other_node&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;numa_foreign&amp;lt;/code&amp;gt; tinggi.&lt;br /&gt;
* Bandwidth memori terukur (mis. benchmark STREAM) jauh di bawah spesifikasi total — karena semua traffic menumpuk di satu memory controller.&lt;br /&gt;
* Di &amp;lt;code&amp;gt;perf&amp;lt;/code&amp;gt;: event &amp;lt;code&amp;gt;node-load-misses&amp;lt;/code&amp;gt; / remote access tinggi.&lt;br /&gt;
&lt;br /&gt;
Cara uji cepat: jalankan program dengan &amp;lt;code&amp;gt;numactl --cpunodebind=0 --membind=0&amp;lt;/code&amp;gt; (semuanya lokal). Kalau versi &amp;quot;dikurung satu node&amp;quot; ini lebih cepat daripada versi bebas pakai semua core — hampir pasti ada masalah penempatan data.&lt;br /&gt;
&lt;br /&gt;
== Tips Praktis ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Kenali dulu mesinmu&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;numactl --hardware&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;lstopo&amp;lt;/code&amp;gt; sebelum tuning apa pun. Di laptop 1 node, semua ini tidak relevan.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Init paralel + pinning&amp;#039;&amp;#039;&amp;#039; adalah kombinasi wajib: first-touch hanya berguna kalau thread tidak berpindah node.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Data mengikuti komputasi&amp;#039;&amp;#039;&amp;#039;: partisi data per thread/rank konsisten dari awal sampai akhir program.&lt;br /&gt;
* Untuk akses yang benar-benar acak dan dibagi semua thread, &amp;lt;code&amp;gt;--interleave=all&amp;lt;/code&amp;gt; sering jadi kompromi terbaik.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Hybrid MPI+OpenMP&amp;#039;&amp;#039;&amp;#039;: satu rank per NUMA node adalah titik awal yang hampir selalu masuk akal.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Audit, jangan asumsi&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;numastat -p&amp;lt;/code&amp;gt; untuk melihat page beneran di node mana, &amp;lt;code&amp;gt;perf&amp;lt;/code&amp;gt; untuk menghitung akses remote.&lt;br /&gt;
* Ingat urutan prioritas optimasi memori: algoritma → [[Cache line|pola akses &amp;amp; cache]] → [[SoA vs AoS|layout data]] → NUMA. Tuning NUMA di atas pola akses yang berantakan itu percuma.&lt;br /&gt;
&lt;br /&gt;
== Lihat Juga ==&lt;br /&gt;
&lt;br /&gt;
* [[Cache line]]&lt;br /&gt;
* [[SoA vs AoS]]&lt;br /&gt;
* [[MPI]]&lt;br /&gt;
* [[OpenMP]]&lt;br /&gt;
* [[Roofline model]]&lt;br /&gt;
&lt;br /&gt;
== Referensi ==&lt;br /&gt;
&lt;br /&gt;
* Christoph Lameter, &amp;quot;NUMA (Non-Uniform Memory Access): An Overview&amp;quot;, &amp;#039;&amp;#039;ACM Queue&amp;#039;&amp;#039;, Vol. 11 No. 7, 2013 — https://queue.acm.org/detail.cfm?id=2513149&lt;br /&gt;
* Ulrich Drepper, &amp;#039;&amp;#039;What Every Programmer Should Know About Memory&amp;#039;&amp;#039;, Red Hat, Inc., 2007 — bagian NUMA — https://people.freebsd.org/~lstewart/articles/cpumemory.pdf&lt;br /&gt;
* John L. Hennessy &amp;amp; David A. Patterson, &amp;#039;&amp;#039;Computer Architecture: A Quantitative Approach&amp;#039;&amp;#039;, 6th Edition, Morgan Kaufmann, 2017 — bab Thread-Level Parallelism (DSM/NUMA).&lt;br /&gt;
* Dokumentasi kernel Linux — &amp;quot;NUMA Memory Policy&amp;quot; — https://www.kernel.org/doc/html/latest/admin-guide/mm/numa_memory_policy.html&lt;br /&gt;
* numactl / libnuma — https://github.com/numactl/numactl (lihat juga man numactl, man numa)&lt;br /&gt;
* Portable Hardware Locality (hwloc), proyek Open MPI — https://www.open-mpi.org/projects/hwloc/&lt;br /&gt;
* Frank Denneman, &amp;quot;NUMA Deep Dive Series&amp;quot; — https://frankdenneman.nl/2016/07/06/introduction-2016-numa-deep-dive-series/&lt;br /&gt;
&lt;br /&gt;
[[Kategori:HPC]]&lt;br /&gt;
[[Kategori:Arsitektur Komputer]]&lt;br /&gt;
[[Kategori:Optimasi Performa]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
</feed>