<?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=Work-Span_Model_%26_Brent%27s_Theorem</id>
	<title>Work-Span Model &amp; Brent&#039;s Theorem - 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=Work-Span_Model_%26_Brent%27s_Theorem"/>
	<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Work-Span_Model_%26_Brent%27s_Theorem&amp;action=history"/>
	<updated>2026-11-01T19:56:01Z</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=Work-Span_Model_%26_Brent%27s_Theorem&amp;diff=794&amp;oldid=prev</id>
		<title>SanzSkuy: Created page with &quot;&#039;&#039;&#039;Work-Span Model&#039;&#039;&#039; adalah cara menganalisis algoritma paralel &#039;&#039;tanpa peduli jumlah prosesor&#039;&#039;. Daripada tanya &quot;berapa cepat di 64 core?&quot;, model ini tanya dua hal yang lebih fundamental: berapa total kerjanya, dan seberapa panjang rantai ketergantungannya. &#039;&#039;&#039;Brent&#039;s Theorem&#039;&#039;&#039; kemudian menjembatani keduanya ke dunia nyata: dari dua angka itu, kita bisa menjamin batas waktu eksekusi di &#039;&#039;p&#039;&#039; prosesor berapa pun.  Ini fondasi teori di balik semua yang praktis: kenapa r...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Work-Span_Model_%26_Brent%27s_Theorem&amp;diff=794&amp;oldid=prev"/>
		<updated>2026-07-11T06:01:49Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;#039;&amp;#039;&amp;#039;Work-Span Model&amp;#039;&amp;#039;&amp;#039; adalah cara menganalisis algoritma paralel &amp;#039;&amp;#039;tanpa peduli jumlah prosesor&amp;#039;&amp;#039;. Daripada tanya &amp;quot;berapa cepat di 64 core?&amp;quot;, model ini tanya dua hal yang lebih fundamental: berapa total kerjanya, dan seberapa panjang rantai ketergantungannya. &amp;#039;&amp;#039;&amp;#039;Brent&amp;#039;s Theorem&amp;#039;&amp;#039;&amp;#039; kemudian menjembatani keduanya ke dunia nyata: dari dua angka itu, kita bisa menjamin batas waktu eksekusi di &amp;#039;&amp;#039;p&amp;#039;&amp;#039; prosesor berapa pun.  Ini fondasi teori di balik semua yang praktis: kenapa r...&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;Work-Span Model&amp;#039;&amp;#039;&amp;#039; adalah cara menganalisis algoritma paralel &amp;#039;&amp;#039;tanpa peduli jumlah prosesor&amp;#039;&amp;#039;. Daripada tanya &amp;quot;berapa cepat di 64 core?&amp;quot;, model ini tanya dua hal yang lebih fundamental: berapa total kerjanya, dan seberapa panjang rantai ketergantungannya. &amp;#039;&amp;#039;&amp;#039;Brent&amp;#039;s Theorem&amp;#039;&amp;#039;&amp;#039; kemudian menjembatani keduanya ke dunia nyata: dari dua angka itu, kita bisa menjamin batas waktu eksekusi di &amp;#039;&amp;#039;p&amp;#039;&amp;#039; prosesor berapa pun.&lt;br /&gt;
&lt;br /&gt;
Ini fondasi teori di balik semua yang praktis: kenapa reduction di [[CUDA: Reduction &amp;amp; Scan|CUDA]] dibuat berbentuk pohon, kenapa scan versi naive dianggap boros, dan kapan nambah GPU itu buang-buang duit.&lt;br /&gt;
&lt;br /&gt;
= Komputasi sebagai DAG =&lt;br /&gt;
&lt;br /&gt;
Bayangkan eksekusi program sebagai &amp;#039;&amp;#039;&amp;#039;directed acyclic graph (DAG)&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* Setiap simpul (node) = satu operasi (misalnya satu penjumlahan).&lt;br /&gt;
* Setiap sisi (edge) = ketergantungan data. Operasi B baru boleh jalan setelah A selesai kalau ada sisi A → B.&lt;br /&gt;
&lt;br /&gt;
Contoh: menghitung &amp;lt;code&amp;gt;(a+b) * (c+d)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 a   b       c   d&lt;br /&gt;
  \ /         \ /&lt;br /&gt;
  (+)         (+)&lt;br /&gt;
    \         /&lt;br /&gt;
     \       /&lt;br /&gt;
       (*)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dua penjumlahan tidak saling bergantung, jadi bisa jalan bersamaan. Perkalian harus menunggu keduanya. DAG ini punya 3 operasi total, tapi jalur terpanjangnya hanya 2 operasi.&lt;br /&gt;
&lt;br /&gt;
Model ini mengabaikan biaya komunikasi, latensi memori, dan overhead scheduling — sengaja. Tujuannya mengisolasi sifat &amp;#039;&amp;#039;algoritmanya&amp;#039;&amp;#039;, bukan mesinnya.&lt;br /&gt;
&lt;br /&gt;
= Work dan Span =&lt;br /&gt;
&lt;br /&gt;
Dua metrik utama:&lt;br /&gt;
&lt;br /&gt;
; Work — T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&lt;br /&gt;
: Total jumlah operasi dalam DAG. Sama dengan waktu eksekusi kalau hanya ada &amp;#039;&amp;#039;&amp;#039;1 prosesor&amp;#039;&amp;#039;&amp;#039; (makanya notasinya T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
; Span — T&amp;lt;sub&amp;gt;∞&amp;lt;/sub&amp;gt;&lt;br /&gt;
: Panjang &amp;#039;&amp;#039;&amp;#039;jalur terpanjang&amp;#039;&amp;#039;&amp;#039; (critical path) dalam DAG. Sama dengan waktu eksekusi kalau prosesornya &amp;#039;&amp;#039;&amp;#039;tak terhingga&amp;#039;&amp;#039;&amp;#039; (makanya T&amp;lt;sub&amp;gt;∞&amp;lt;/sub&amp;gt;). Disebut juga &amp;#039;&amp;#039;depth&amp;#039;&amp;#039;. Sebanyak apa pun prosesor yang dilempar ke masalah ini, kita tidak bisa lebih cepat dari span — dependensi tidak bisa disogok.&lt;br /&gt;
&lt;br /&gt;
Contoh klasik: menjumlahkan n = 8 angka dengan pohon reduksi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 x0  x1  x2  x3  x4  x5  x6  x7&lt;br /&gt;
  \  /    \  /    \  /    \  /&lt;br /&gt;
  (+)     (+)     (+)     (+)      level 1&lt;br /&gt;
    \     /         \     /&lt;br /&gt;
     \   /           \   /&lt;br /&gt;
      (+)             (+)          level 2&lt;br /&gt;
        \             /&lt;br /&gt;
         \           /&lt;br /&gt;
             (+)                   level 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Work: T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; = n − 1 = 7 penjumlahan (sama seperti loop sekuensial — tidak ada kerja ekstra).&lt;br /&gt;
* Span: T&amp;lt;sub&amp;gt;∞&amp;lt;/sub&amp;gt; = log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; n = 3 level.&lt;br /&gt;
&lt;br /&gt;
Untuk n besar: work Θ(n), span Θ(log n). Bandingkan dengan loop sekuensial &amp;lt;code&amp;gt;sum += x[i]&amp;lt;/code&amp;gt;: work-nya sama Θ(n), tapi span-nya juga Θ(n) karena setiap iterasi bergantung pada hasil sebelumnya — DAG-nya rantai lurus. Algoritmanya harus &amp;#039;&amp;#039;disusun ulang&amp;#039;&amp;#039; supaya span turun; kompilator tidak melakukan ini gratis.&lt;br /&gt;
&lt;br /&gt;
= Dua Hukum Dasar =&lt;br /&gt;
&lt;br /&gt;
Misal T&amp;lt;sub&amp;gt;p&amp;lt;/sub&amp;gt; = waktu eksekusi di p prosesor. Dua batas bawah yang tidak bisa ditawar:&lt;br /&gt;
&lt;br /&gt;
; Work Law&lt;br /&gt;
: T&amp;lt;sub&amp;gt;p&amp;lt;/sub&amp;gt; ≥ T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; / p&lt;br /&gt;
: p prosesor paling banter menyelesaikan p operasi per satuan waktu. Konsekuensinya: speedup S&amp;lt;sub&amp;gt;p&amp;lt;/sub&amp;gt; = T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;/T&amp;lt;sub&amp;gt;p&amp;lt;/sub&amp;gt; ≤ p. Tidak ada speedup superlinear di model ini (kalau di dunia nyata ketemu superlinear, biasanya efek cache, bukan keajaiban algoritma).&lt;br /&gt;
&lt;br /&gt;
; Span Law&lt;br /&gt;
: T&amp;lt;sub&amp;gt;p&amp;lt;/sub&amp;gt; ≥ T&amp;lt;sub&amp;gt;∞&amp;lt;/sub&amp;gt;&lt;br /&gt;
: Prosesor tambahan tidak bisa memotong critical path.&lt;br /&gt;
&lt;br /&gt;
Gabungan keduanya: T&amp;lt;sub&amp;gt;p&amp;lt;/sub&amp;gt; ≥ max(T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;/p, T&amp;lt;sub&amp;gt;∞&amp;lt;/sub&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
= Parallelism =&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Parallelism&amp;#039;&amp;#039;&amp;#039; sebuah algoritma didefinisikan sebagai:&lt;br /&gt;
&lt;br /&gt;
: P̄ = T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; / T&amp;lt;sub&amp;gt;∞&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ini rata-rata banyaknya operasi yang tersedia untuk dikerjakan paralel di sepanjang critical path — sekaligus &amp;#039;&amp;#039;&amp;#039;speedup maksimum yang mungkin dicapai&amp;#039;&amp;#039;&amp;#039;, berapa pun jumlah prosesornya.&lt;br /&gt;
&lt;br /&gt;
Contoh pohon reduksi n = 1024: P̄ = 1023 / 10 ≈ 102. Artinya pakai lebih dari ±102 prosesor untuk masalah ini percuma; speedup mentok di situ.&lt;br /&gt;
&lt;br /&gt;
Aturan praktis (&amp;#039;&amp;#039;&amp;#039;parallel slackness&amp;#039;&amp;#039;&amp;#039;): kalau p ≪ P̄ (misal 10× lebih kecil), maka speedup mendekati linear, T&amp;lt;sub&amp;gt;p&amp;lt;/sub&amp;gt; ≈ T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;/p. Kalau p mendekati atau melebihi P̄, span mulai mendominasi dan speedup jenuh. Ini alasan GPU butuh masalah besar: dengan puluhan ribu thread, P̄ masalahnya harus jauh lebih besar lagi supaya semua thread kebagian kerja.&lt;br /&gt;
&lt;br /&gt;
= Brent&amp;#039;s Theorem =&lt;br /&gt;
&lt;br /&gt;
Work law dan span law memberi batas &amp;#039;&amp;#039;&amp;#039;bawah&amp;#039;&amp;#039;&amp;#039;. Brent&amp;#039;s Theorem (R. P. Brent, 1974) memberi batas &amp;#039;&amp;#039;&amp;#039;atas&amp;#039;&amp;#039;&amp;#039; — jaminan bahwa waktu segini pasti tercapai:&lt;br /&gt;
&lt;br /&gt;
: &amp;#039;&amp;#039;&amp;#039;T&amp;lt;sub&amp;gt;p&amp;lt;/sub&amp;gt; ≤ T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;/p + T&amp;lt;sub&amp;gt;∞&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
(Bentuk yang lebih ketat: T&amp;lt;sub&amp;gt;p&amp;lt;/sub&amp;gt; ≤ (T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; − T&amp;lt;sub&amp;gt;∞&amp;lt;/sub&amp;gt;)/p + T&amp;lt;sub&amp;gt;∞&amp;lt;/sub&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
== Sketsa Bukti ==&lt;br /&gt;
&lt;br /&gt;
Susun DAG per level: level i berisi semua operasi yang jarak terjauhnya dari input adalah i. Ada T&amp;lt;sub&amp;gt;∞&amp;lt;/sub&amp;gt; level, dan misal level i berisi m&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; operasi (jumlah semua m&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; = T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Semua operasi dalam satu level saling bebas, jadi p prosesor bisa mengerjakan level i dalam:&lt;br /&gt;
&lt;br /&gt;
: ⌈m&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; / p⌉ ≤ m&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/p + 1&lt;br /&gt;
&lt;br /&gt;
Jumlahkan untuk semua level:&lt;br /&gt;
&lt;br /&gt;
: T&amp;lt;sub&amp;gt;p&amp;lt;/sub&amp;gt; ≤ Σ (m&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;/p + 1) = T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;/p + T&amp;lt;sub&amp;gt;∞&amp;lt;/sub&amp;gt;. ∎&lt;br /&gt;
&lt;br /&gt;
Intuisinya: waktu eksekusi terpecah jadi dua komponen — bagian yang bisa dibagi rata ke prosesor (T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;/p) dan &amp;quot;pajak&amp;quot; struktur dependensi yang harus dibayar penuh (T&amp;lt;sub&amp;gt;∞&amp;lt;/sub&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Contoh Angka ==&lt;br /&gt;
&lt;br /&gt;
Pohon reduksi n = 1024 (T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; = 1023, T&amp;lt;sub&amp;gt;∞&amp;lt;/sub&amp;gt; = 10) di p = 32 prosesor:&lt;br /&gt;
&lt;br /&gt;
* Batas bawah: T&amp;lt;sub&amp;gt;32&amp;lt;/sub&amp;gt; ≥ max(1023/32, 10) = max(32, 10) = 32&lt;br /&gt;
* Batas atas (Brent): T&amp;lt;sub&amp;gt;32&amp;lt;/sub&amp;gt; ≤ 1023/32 + 10 ≈ 42&lt;br /&gt;
&lt;br /&gt;
Jadi tanpa menjalankan apa pun, kita tahu waktunya di antara 32 dan 42 langkah. Speedup dijamin minimal 1023/42 ≈ 24× dari maksimum teoretis 32×.&lt;br /&gt;
&lt;br /&gt;
== Korolari: Greedy Scheduler 2-Optimal ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Greedy scheduler&amp;#039;&amp;#039;&amp;#039; = scheduler yang tidak pernah membiarkan prosesor nganggur selama masih ada operasi yang siap jalan. Setiap greedy scheduler memenuhi batas Brent. Karena batas bawahnya max(T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;/p, T&amp;lt;sub&amp;gt;∞&amp;lt;/sub&amp;gt;) dan:&lt;br /&gt;
&lt;br /&gt;
: T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;/p + T&amp;lt;sub&amp;gt;∞&amp;lt;/sub&amp;gt; ≤ 2 · max(T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;/p, T&amp;lt;sub&amp;gt;∞&amp;lt;/sub&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
maka greedy scheduler mana pun paling buruk &amp;#039;&amp;#039;&amp;#039;2× dari optimal&amp;#039;&amp;#039;&amp;#039;. Ini alasan teoretis kenapa runtime seperti Cilk, TBB, dan [[OpenMP: Tasking|OpenMP tasking]] pakai greedy &amp;#039;&amp;#039;&amp;#039;work-stealing&amp;#039;&amp;#039;&amp;#039; dan hasilnya bagus: work-stealing mencapai ekspektasi T&amp;lt;sub&amp;gt;p&amp;lt;/sub&amp;gt; ≤ T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;/p + O(T&amp;lt;sub&amp;gt;∞&amp;lt;/sub&amp;gt;) tanpa perlu scheduler pintar-pintar amat.&lt;br /&gt;
&lt;br /&gt;
Pesan praktisnya buat kita: &amp;#039;&amp;#039;&amp;#039;jangan pusing mikirin scheduling manual; pusinglah menurunkan span dan menjaga work tetap kecil.&amp;#039;&amp;#039;&amp;#039; Scheduler sudah hampir optimal; algoritmanya yang menentukan.&lt;br /&gt;
&lt;br /&gt;
= Work-Efficiency =&lt;br /&gt;
&lt;br /&gt;
Algoritma paralel disebut &amp;#039;&amp;#039;&amp;#039;work-efficient&amp;#039;&amp;#039;&amp;#039; kalau work-nya (asimtotik) sama dengan algoritma sekuensial terbaik. Ini kriteria penting yang sering dilupakan karena orang silau sama span kecil.&lt;br /&gt;
&lt;br /&gt;
Contoh terkenal — [[Parallel Prefix Sum (Scan)|prefix sum]]:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Algoritma !! Work !! Span !! Work-efficient?&lt;br /&gt;
|-&lt;br /&gt;
| Sekuensial || Θ(n) || Θ(n) || (baseline)&lt;br /&gt;
|-&lt;br /&gt;
| Naive/Hillis-Steele || Θ(n log n) || Θ(log n) || Tidak&lt;br /&gt;
|-&lt;br /&gt;
| Blelloch (up-sweep/down-sweep) || Θ(n) || Θ(log n) || Ya&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Hillis-Steele span-nya bagus tapi membayar log n kali lipat kerja ekstra. Di p prosesor, suku T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;/p pada batas Brent membengkak log n kali — algoritma yang &amp;quot;lebih paralel&amp;quot; justru kalah begitu p terbatas (dan p &amp;#039;&amp;#039;selalu&amp;#039;&amp;#039; terbatas). Blelloch dapat span yang sama dengan work optimal. Inilah kenapa scan produksi (CUB, Thrust) berbasis Blelloch.&lt;br /&gt;
&lt;br /&gt;
Aturan main mendesain algoritma paralel, urut prioritas:&lt;br /&gt;
# Work seminimal mungkin (idealnya work-efficient) — karena T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;/p mendominasi saat p kecil.&lt;br /&gt;
# Span serendah mungkin (idealnya polylog, misal Θ(log n)) — supaya scalable saat p besar.&lt;br /&gt;
&lt;br /&gt;
= Contoh Analisis Cepat =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Algoritma !! Work T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; !! Span T&amp;lt;sub&amp;gt;∞&amp;lt;/sub&amp;gt; !! Parallelism&lt;br /&gt;
|-&lt;br /&gt;
| Penjumlahan/reduksi (pohon) || Θ(n) || Θ(log n) || Θ(n / log n)&lt;br /&gt;
|-&lt;br /&gt;
| Parallel for (badan independen) || Θ(n) || Θ(1)* || Θ(n)&lt;br /&gt;
|-&lt;br /&gt;
| Matmul klasik (loop ijk diparalelkan) || Θ(n³) || Θ(log n) || Θ(n³ / log n)&lt;br /&gt;
|-&lt;br /&gt;
| Quicksort paralel (partisi sekuensial) || Θ(n log n) || Θ(n) || Θ(log n) — jelek!&lt;br /&gt;
|-&lt;br /&gt;
| Merge sort paralel (merge paralel) || Θ(n log n) || Θ(log³ n) || bagus&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;*Θ(1) kalau spawn-nya dianggap gratis; dengan spawn pohon biner jadi Θ(log n).&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Baris quicksort menarik: rekursinya paralel, tapi partisi Θ(n) yang sekuensial masuk ke critical path di setiap level rekursi. Hasilnya span Θ(n) dan parallelism cuma Θ(log n) — hampir tidak scalable. Pola gagal seperti ini baru kelihatan kalau dianalisis pakai work-span; benchmark di 4 core tidak akan menunjukkannya. Lebih detail di [[Parallel Sorting]].&lt;br /&gt;
&lt;br /&gt;
Contoh kode gaya OpenMP task untuk reduksi pohon (bandingkan span-nya dengan loop biasa):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Work: T1 = Θ(n), Span: T∞ = Θ(log n)&lt;br /&gt;
long sum(long *x, int lo, int hi) {&lt;br /&gt;
    if (hi - lo &amp;lt; CUTOFF) {              // basis: sekuensial&lt;br /&gt;
        long s = 0;&lt;br /&gt;
        for (int i = lo; i &amp;lt; hi; i++) s += x[i];&lt;br /&gt;
        return s;&lt;br /&gt;
    }&lt;br /&gt;
    int mid = (lo + hi) / 2;&lt;br /&gt;
    long a, b;&lt;br /&gt;
    #pragma omp task shared(a)&lt;br /&gt;
    a = sum(x, lo, mid);                  // dua cabang independen:&lt;br /&gt;
    b = sum(x, mid, hi);                  // inilah yang memotong span&lt;br /&gt;
    #pragma omp taskwait&lt;br /&gt;
    return a + b;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Rekurensi span-nya: T&amp;lt;sub&amp;gt;∞&amp;lt;/sub&amp;gt;(n) = T&amp;lt;sub&amp;gt;∞&amp;lt;/sub&amp;gt;(n/2) + Θ(1) = Θ(log n), karena dua cabang jalan &amp;#039;&amp;#039;bersamaan&amp;#039;&amp;#039; — hanya satu yang dihitung. Work-nya tetap: T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;(n) = 2·T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;(n/2) + Θ(1) = Θ(n).&lt;br /&gt;
&lt;br /&gt;
= Hubungan dengan Amdahl&amp;#039;s Law =&lt;br /&gt;
&lt;br /&gt;
[[Amdahl&amp;#039;s law]] adalah kasus khusus dari span law. Kalau fraksi f dari program sekuensial murni, maka bagian itu masuk penuh ke critical path: T&amp;lt;sub&amp;gt;∞&amp;lt;/sub&amp;gt; ≥ f·T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, sehingga parallelism P̄ ≤ 1/f — persis batas speedup Amdahl. Bedanya:&lt;br /&gt;
&lt;br /&gt;
* Amdahl membagi program kasar jadi dua kotak: &amp;quot;sekuensial&amp;quot; dan &amp;quot;paralel sempurna&amp;quot;.&lt;br /&gt;
* Work-span melihat struktur dependensi sebenarnya, jadi bisa menganalisis algoritma yang bagian paralelnya pun punya dependensi internal (seperti pohon reduksi).&lt;br /&gt;
&lt;br /&gt;
Work-span lebih tajam; Amdahl lebih gampang dipakai buat estimasi kasar sistem utuh. Untuk sisi &amp;quot;problem size ikut membesar&amp;quot;, lihat [[Gustafson&amp;#039;s Law]] — dalam bahasa work-span: n naik → T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; naik jauh lebih cepat dari T&amp;lt;sub&amp;gt;∞&amp;lt;/sub&amp;gt; → parallelism naik → prosesor banyak jadi berguna lagi.&lt;br /&gt;
&lt;br /&gt;
= Batas Model =&lt;br /&gt;
&lt;br /&gt;
Yang sengaja diabaikan model ini (dan bisa menggigit di dunia nyata):&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Komunikasi &amp;amp; memori&amp;#039;&amp;#039;&amp;#039; — di cluster, memindahkan data sering lebih mahal dari menghitungnya. Pelengkapnya: [[Roofline model]] (batas bandwidth) dan [[Isoefficiency &amp;amp; Scalability]] (overhead komunikasi vs ukuran masalah).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Overhead spawn/sync&amp;#039;&amp;#039;&amp;#039; — makanya kode nyata selalu pakai CUTOFF/grain size; task terlalu kecil membuat konstanta di T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; membengkak.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Heterogenitas&amp;#039;&amp;#039;&amp;#039; — semua &amp;quot;prosesor&amp;quot; dianggap identik dan satu operasi = satu satuan waktu.&lt;br /&gt;
&lt;br /&gt;
Model ini menjawab &amp;quot;algoritmanya scalable atau tidak&amp;quot;, bukan &amp;quot;programnya cepat atau tidak&amp;quot;. Dua-duanya perlu.&lt;br /&gt;
&lt;br /&gt;
= Ringkasan =&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Work T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039;&amp;#039; = total operasi; &amp;#039;&amp;#039;&amp;#039;Span T&amp;lt;sub&amp;gt;∞&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039;&amp;#039; = critical path.&lt;br /&gt;
* Batas bawah: T&amp;lt;sub&amp;gt;p&amp;lt;/sub&amp;gt; ≥ max(T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;/p, T&amp;lt;sub&amp;gt;∞&amp;lt;/sub&amp;gt;). Batas atas (Brent): T&amp;lt;sub&amp;gt;p&amp;lt;/sub&amp;gt; ≤ T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;/p + T&amp;lt;sub&amp;gt;∞&amp;lt;/sub&amp;gt;.&lt;br /&gt;
* Parallelism P̄ = T&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;/T&amp;lt;sub&amp;gt;∞&amp;lt;/sub&amp;gt; = speedup maksimum. Pakai p ≪ P̄ supaya speedup ≈ linear.&lt;br /&gt;
* Greedy/work-stealing scheduler ≤ 2× optimal → fokus ke algoritma, bukan scheduler.&lt;br /&gt;
* Turunkan span, tapi &amp;#039;&amp;#039;&amp;#039;jangan korbankan work-efficiency&amp;#039;&amp;#039;&amp;#039; (pelajaran Blelloch vs Hillis-Steele).&lt;br /&gt;
&lt;br /&gt;
= Lihat Juga =&lt;br /&gt;
&lt;br /&gt;
* [[Amdahl&amp;#039;s law]] — kasus khusus span law&lt;br /&gt;
* [[Gustafson&amp;#039;s Law]] — scaling dengan problem size&lt;br /&gt;
* [[Parallel Prefix Sum (Scan)]] — studi kasus work-efficiency&lt;br /&gt;
* [[Parallel Sorting]] — studi kasus span di algoritma rekursif&lt;br /&gt;
* [[CUDA: Reduction &amp;amp; Scan]] — implementasi nyata pohon reduksi&lt;br /&gt;
* [[OpenMP: Tasking]] — work-stealing di praktik&lt;br /&gt;
* [[Roofline model]] — batas dari sisi memori/bandwidth&lt;br /&gt;
&lt;br /&gt;
[[Kategori:HPC]]&lt;br /&gt;
[[Kategori:Teori Algoritma Paralel]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
</feed>