<?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=MPI%3A_Bcast</id>
	<title>MPI: Bcast - 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=MPI%3A_Bcast"/>
	<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=MPI:_Bcast&amp;action=history"/>
	<updated>2026-11-01T21:45:38Z</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=MPI:_Bcast&amp;diff=690&amp;oldid=prev</id>
		<title>SanzSkuy: Created page with &quot;&#039;&#039;&#039;&lt;code&gt;MPI_Bcast&lt;/code&gt;&#039;&#039;&#039; (&#039;&#039;broadcast&#039;&#039;) adalah salah satu &#039;&#039;collective communication primitive&#039;&#039; dalam MPI yang digunakan untuk menyalin data dari satu proses (&#039;&#039;root&#039;&#039;) ke seluruh proses lain dalam suatu &#039;&#039;communicator&#039;&#039;. Setelah pemanggilan selesai, semua proses memiliki salinan data yang identik.  == Signature ==  &lt;syntaxhighlight lang=&quot;c&quot;&gt; int MPI_Bcast(     void         *buffer,     int           count,     MPI_Datatype  datatype,     int           root,     MP...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=MPI:_Bcast&amp;diff=690&amp;oldid=prev"/>
		<updated>2026-06-25T02:37:24Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;MPI_Bcast&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;broadcast&amp;#039;&amp;#039;) adalah salah satu &amp;#039;&amp;#039;collective communication primitive&amp;#039;&amp;#039; dalam MPI yang digunakan untuk menyalin data dari satu proses (&amp;#039;&amp;#039;root&amp;#039;&amp;#039;) ke seluruh proses lain dalam suatu &amp;#039;&amp;#039;communicator&amp;#039;&amp;#039;. Setelah pemanggilan selesai, semua proses memiliki salinan data yang identik.  == Signature ==  &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt; int MPI_Bcast(     void         *buffer,     int           count,     MPI_Datatype  datatype,     int           root,     MP...&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;&amp;lt;code&amp;gt;MPI_Bcast&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;broadcast&amp;#039;&amp;#039;) adalah salah satu &amp;#039;&amp;#039;collective communication primitive&amp;#039;&amp;#039; dalam MPI yang digunakan untuk menyalin data dari satu proses (&amp;#039;&amp;#039;root&amp;#039;&amp;#039;) ke seluruh proses lain dalam suatu &amp;#039;&amp;#039;communicator&amp;#039;&amp;#039;. Setelah pemanggilan selesai, semua proses memiliki salinan data yang identik.&lt;br /&gt;
&lt;br /&gt;
== Signature ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int MPI_Bcast(&lt;br /&gt;
    void         *buffer,&lt;br /&gt;
    int           count,&lt;br /&gt;
    MPI_Datatype  datatype,&lt;br /&gt;
    int           root,&lt;br /&gt;
    MPI_Comm      comm&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Parameter !! Arah !! Deskripsi&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;buffer&amp;lt;/code&amp;gt; || in/out || Pointer ke buffer data. Di proses &amp;#039;&amp;#039;root&amp;#039;&amp;#039;, berisi data yang akan dikirim. Di proses lain, akan diisi dengan data yang diterima.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; || in || Jumlah elemen dalam &amp;lt;code&amp;gt;buffer&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;datatype&amp;lt;/code&amp;gt; || in || Tipe data tiap elemen (misal &amp;lt;code&amp;gt;MPI_FLOAT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MPI_INT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MPI_DOUBLE&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; || in || &amp;#039;&amp;#039;Rank&amp;#039;&amp;#039; proses yang menjadi sumber data.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;comm&amp;lt;/code&amp;gt; || in || &amp;#039;&amp;#039;Communicator&amp;#039;&amp;#039; tempat operasi dilakukan (umumnya &amp;lt;code&amp;gt;MPI_COMM_WORLD&amp;lt;/code&amp;gt;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Semantik ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MPI_Bcast&amp;lt;/code&amp;gt; adalah operasi &amp;#039;&amp;#039;&amp;#039;kolektif&amp;#039;&amp;#039;&amp;#039; dan &amp;#039;&amp;#039;&amp;#039;blocking&amp;#039;&amp;#039;&amp;#039; (dalam standar MPI-3 dan sebelumnya):&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Kolektif&amp;#039;&amp;#039;&amp;#039;: Semua proses dalam &amp;lt;code&amp;gt;comm&amp;lt;/code&amp;gt; &amp;#039;&amp;#039;&amp;#039;wajib&amp;#039;&amp;#039;&amp;#039; memanggil &amp;lt;code&amp;gt;MPI_Bcast&amp;lt;/code&amp;gt; dengan nilai &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;comm&amp;lt;/code&amp;gt; yang sama. Jika ada satu proses yang tidak memanggil, program akan &amp;#039;&amp;#039;deadlock&amp;#039;&amp;#039;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Blocking&amp;#039;&amp;#039;&amp;#039;: Pemanggilan akan kembali (&amp;#039;&amp;#039;return&amp;#039;&amp;#039;) setelah &amp;#039;&amp;#039;buffer&amp;#039;&amp;#039; lokal aman untuk digunakan kembali; bukan setelah semua proses menerima data.&lt;br /&gt;
&lt;br /&gt;
Perlu dicatat bahwa proses &amp;#039;&amp;#039;root&amp;#039;&amp;#039; juga memanggil &amp;lt;code&amp;gt;MPI_Bcast&amp;lt;/code&amp;gt;, bukan hanya proses penerima. Ini berbeda dari pola &amp;#039;&amp;#039;send/recv&amp;#039;&amp;#039; di &amp;#039;&amp;#039;point-to-point&amp;#039;&amp;#039; communication.&lt;br /&gt;
&lt;br /&gt;
== Contoh penggunaan ==&lt;br /&gt;
&lt;br /&gt;
Contoh: &amp;#039;&amp;#039;root&amp;#039;&amp;#039; (rank 0) menyiarkan sebuah matriks &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; berukuran 1024×1024 ke seluruh proses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;mpi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv) {&lt;br /&gt;
    MPI_Init(&amp;amp;argc, &amp;amp;argv);&lt;br /&gt;
&lt;br /&gt;
    int rank, size;&lt;br /&gt;
    MPI_Comm_rank(MPI_COMM_WORLD, &amp;amp;rank);&lt;br /&gt;
    MPI_Comm_size(MPI_COMM_WORLD, &amp;amp;size);&lt;br /&gt;
&lt;br /&gt;
    const int N = 1024;&lt;br /&gt;
    float *B = (float*) malloc(N * N * sizeof(float));&lt;br /&gt;
&lt;br /&gt;
    if (rank == 0) {&lt;br /&gt;
        // Hanya root yang menginisialisasi data&lt;br /&gt;
        for (int i = 0; i &amp;lt; N * N; i++) {&lt;br /&gt;
            B[i] = (float) i;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Semua proses memanggil MPI_Bcast&lt;br /&gt;
    MPI_Bcast(B, N * N, MPI_FLOAT, 0, MPI_COMM_WORLD);&lt;br /&gt;
&lt;br /&gt;
    // Setelah baris ini, semua proses memiliki salinan B yang identik&lt;br /&gt;
&lt;br /&gt;
    free(B);&lt;br /&gt;
    MPI_Finalize();&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pola penggunaan umum ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MPI_Bcast&amp;lt;/code&amp;gt; sering muncul dalam pola berikut:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Distribusi parameter konfigurasi&amp;#039;&amp;#039;&amp;#039; dari &amp;#039;&amp;#039;root&amp;#039;&amp;#039; ke seluruh &amp;#039;&amp;#039;worker&amp;#039;&amp;#039; di awal program.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Distributed matrix multiplication&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;C = A × B&amp;#039;&amp;#039;): matriks &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; di-&amp;#039;&amp;#039;scatter&amp;#039;&amp;#039; per baris dengan {{ml|MPI_Scatterv}}, sementara matriks &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; disiarkan utuh dengan &amp;lt;code&amp;gt;MPI_Bcast&amp;lt;/code&amp;gt; karena setiap proses memerlukan seluruh &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; untuk menghitung bagiannya.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Iterative solver&amp;#039;&amp;#039;&amp;#039; (misal Jacobi, Conjugate Gradient): broadcast nilai konvergensi atau &amp;#039;&amp;#039;global reduction result&amp;#039;&amp;#039; tiap iterasi.&lt;br /&gt;
&lt;br /&gt;
== Implementasi internal ==&lt;br /&gt;
&lt;br /&gt;
Implementasi MPI modern (Open MPI, MPICH) tidak melakukan &amp;#039;&amp;#039;broadcast&amp;#039;&amp;#039; secara naif (root mengirim ke tiap proses satu per satu). Sebaliknya, digunakan algoritma berbasis topologi seperti:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Binomial tree&amp;#039;&amp;#039;&amp;#039;: kompleksitas {{math|O(log P)}} langkah komunikasi, cocok untuk pesan kecil.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Scatter + Allgather (Van de Geijn)&amp;#039;&amp;#039;&amp;#039;: lebih efisien untuk pesan besar karena memanfaatkan &amp;#039;&amp;#039;bandwidth&amp;#039;&amp;#039; agregat.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Pipeline&amp;#039;&amp;#039;&amp;#039;: memecah pesan besar menjadi &amp;#039;&amp;#039;chunk&amp;#039;&amp;#039; yang dialirkan &amp;#039;&amp;#039;overlap&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Pemilihan algoritma dilakukan otomatis oleh MPI runtime berdasarkan ukuran pesan, jumlah proses, dan topologi jaringan.&lt;br /&gt;
&lt;br /&gt;
== Performa ==&lt;br /&gt;
&lt;br /&gt;
Biaya komunikasi &amp;lt;code&amp;gt;MPI_Bcast&amp;lt;/code&amp;gt; dapat dimodelkan secara kasar dengan:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_\text{bcast} \approx \alpha \log_2 P + \beta \cdot n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
dengan:&lt;br /&gt;
* &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; = &amp;#039;&amp;#039;latency&amp;#039;&amp;#039; per pesan&lt;br /&gt;
* &amp;lt;math&amp;gt;\beta&amp;lt;/math&amp;gt; = waktu per &amp;#039;&amp;#039;byte&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; = ukuran pesan dalam &amp;#039;&amp;#039;byte&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; = jumlah proses&lt;br /&gt;
&lt;br /&gt;
Konsekuensinya:&lt;br /&gt;
* Untuk pesan kecil, &amp;#039;&amp;#039;&amp;#039;latency&amp;#039;&amp;#039;&amp;#039; (&amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;) yang dominan; semakin banyak proses semakin lama.&lt;br /&gt;
* Untuk pesan besar, &amp;#039;&amp;#039;&amp;#039;bandwidth&amp;#039;&amp;#039;&amp;#039; (&amp;lt;math&amp;gt;\beta \cdot n&amp;lt;/math&amp;gt;) yang dominan; pengaruh jumlah proses berkurang.&lt;br /&gt;
&lt;br /&gt;
Pada &amp;#039;&amp;#039;cluster&amp;#039;&amp;#039; heterogen (misal mencampur &amp;#039;&amp;#039;node&amp;#039;&amp;#039; cepat dan lambat), &amp;lt;code&amp;gt;MPI_Bcast&amp;lt;/code&amp;gt; akan terhambat oleh &amp;#039;&amp;#039;node&amp;#039;&amp;#039; terlambat karena sifat &amp;#039;&amp;#039;synchronous&amp;#039;&amp;#039;-nya. Semua proses harus selesai menerima sebelum operasi dianggap selesai.&lt;br /&gt;
&lt;br /&gt;
== Hubungan dengan primitif lain ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Primitif !! Arah data !! Keterangan&lt;br /&gt;
|-&lt;br /&gt;
| {{ml|MPI_Bcast}} || 1 → N || Semua proses menerima data yang sama dari &amp;#039;&amp;#039;root&amp;#039;&amp;#039;.&lt;br /&gt;
|-&lt;br /&gt;
| {{ml|MPI_Scatter}} || 1 → N || &amp;#039;&amp;#039;Root&amp;#039;&amp;#039; membagi data menjadi potongan-potongan ke tiap proses.&lt;br /&gt;
|-&lt;br /&gt;
| {{ml|MPI_Gather}} || N → 1 || &amp;#039;&amp;#039;Root&amp;#039;&amp;#039; mengumpulkan data dari semua proses.&lt;br /&gt;
|-&lt;br /&gt;
| {{ml|MPI_Allgather}} || N → N || Semua proses memiliki gabungan data dari semua proses.&lt;br /&gt;
|-&lt;br /&gt;
| {{ml|MPI_Reduce}} || N → 1 || &amp;#039;&amp;#039;Root&amp;#039;&amp;#039; menerima hasil agregasi (sum, max, dll).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Catatan ==&lt;br /&gt;
&lt;br /&gt;
* Sejak MPI-3, tersedia versi &amp;#039;&amp;#039;non-blocking&amp;#039;&amp;#039; yaitu {{ml|MPI_Ibcast}} yang memungkinkan &amp;#039;&amp;#039;overlap&amp;#039;&amp;#039; komunikasi dengan komputasi.&lt;br /&gt;
* Buffer di proses &amp;#039;&amp;#039;root&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;tidak boleh&amp;#039;&amp;#039;&amp;#039; di-&amp;#039;&amp;#039;alias&amp;#039;&amp;#039;-kan dengan buffer penerima; meskipun praktiknya buffer yang sama digunakan untuk in/out.&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
</feed>