MPI Communication
MPI Communication
Dosen Pembimbing
Heri Wijayanto, ST.,MT., Ph.D.
UNIVERSITAS MATARAM
FAKULTAS TEKNIK
TEKNIK INFORMATIKA
2022/2023
A. Latar Belakang Program
Pemrosesan paralel merupakan suatu operasi komputer yang dimana proses
pengerjaannya dilakukan secara bersama-sama dengan menggunakan beberapa komputer.
Tujuan dari pemrosesan paralel yaitu mempersingkat waktu eksekusi suatu program dan
meningkatkan performa komputasi. Untuk itu, diperlukan adanya MPI atau Message
Passing Interface dalam menyelesaikan kode program paralel.
MPI merupakan sebuah protokol komunikasi yang sifatnya language independent,
portable dalam men-support berbagai platform, dan memiliki spesifikasi semantik yang
mengatur bagaimana perilaku setiap implementasinya. MPI mendukung komunikasi baik
dengan tipe point-to-point maupun yang bersifat kolektif. MPI juga menjamin message
yang dibuat oleh komunikasi kolektif tidak akan tercampur dengan message yang dibuat
pada komunikasi point-to-point. Standar MPI yang saya gunakan pada program ini yaitu
menggunakan Broadcast, Gather dan Scatter, serta Reduce. Broadcast merupakan teknik
mengirimkan data dari satu proses ke proses lainnya. Sedangkan gather merupakan teknik
menggabungkan semua data dengan mengambil subset dari array yang didistribusikan ke
seluruh rank dan mengumpulkan kembali data tersebut pada array yang utuh. Pada scatter
dilakukan teknik pengambilan array dan pendistribusian bagian yang berdekatan dengan
rank communicator. Sedangkan reduce merupakan teknik menggabungkan data dengan
menjumlahkan data tersebut dengan menggunakan code “MPI.SUM”.
B. Visualisasi Program
C. Source Code
from mpi4py import MPI
import numpy as np
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()
Pada script diatas terdapat subpackage “mpi4py” dengan melalukan import MPI. Selain
itu dilakukan import library numpy yang digunakan untuk melakukan operasi aritmetika.
Terdapat pula variabel “comm” yang berfungsi sebagai komunikator yang dimana pada
setiap proses program dalam komunikator akan saling berkomunikasi. Dan terdapat
variabel rank dan size yang yang digunakan untuk mendapatkan nilai rank dan ukuran dari
program.
if rank == 0:
data = np.arange(20.0)
else:
data = np.zeros(20)
comm.Bcast(data, root=0)
comm.Bcast(count, root=0)
recvbuf = np.zeros(count[rank])
if comm.Get_rank() == 0:
print('Setelah Gather, proses 0 mempunyai data:', recvbuf2)
Pada script diatas terdapat variabel “sendbuf2” yang akan menampung nilai dari
variabel “recvbuf”. Lalu terdapat variabel “recvbuf2” yang berisi array kosong dan
nantinya akan menampung nilai pada program. Kemudian perintah “comm.Gatherv” akan
dipanggil untuk menampilkan nilai dalam proses gather dengan parameter “sendbuf2”
dan “root=0” dan juga “[recvbuf2, count, displacement, MPI.DOUBLE]”. Lalu jika
rank bernilai 0 maka akan mengeksekusi perintah print yang akan menampilkan nilai
gather.
partial_sum = np.zeros(1)
partial_sum[0] = sum(recvbuf)
print('Jumlah parsial pada proses {} yaitu:'.format(rank),
partial_sum[0])
total_sum = np.zeros(1)
comm.Reduce(partial_sum, total_sum, op=MPI.SUM, root=0)
if comm.Get_rank() == 0:
print('Setelah Reduce, total sum pada proses 0 yaitu:', total_sum[0])
Pada script diatas terdapat terdapat variabel “partial_sum” yang berisi variabel
kosong dengan ukuran 1 yang nantinya akan digunakan untuk menampung nilai lainnya.
Kemudian variabel “partial_sum” pada indeks 0 akan menyimpan nilai variabel
“recvbuf” yang dilakukan proses penjumlahan menggunakan fungsi “sum()”. Dan
selanjutnya akan dilakukan perintah print untuk menampilkan jumlah parsial pada proses-
proses program. Selain itu terdapat variabel “total_sum” yang berisi variabel kosong
dengan ukuran 1 yang nantinya akan digunakan untuk menampung nilai. Lalu dilakukan
perintah “comm.Reduce” dengan parameter “partial_sum, total_sum, op=MPI.SUM,
root=0” yang digunakan untuk menggabungkan data dan menjumlahkan data tersebut.
Selanjutnya terdapat pengkondisian “if” apabila rank bernilai 0 maka akan dilakukan
perintah print dengan menampilkan total penjumlahan seluruh data pada proses-proses
program
D. Hasil Run
Berdasarkan hasil run dari program diatas terdapat proses 0 sampai 7 yang memiliki
data angka 0 hingga 19 atau yang disebut sebagai proses broadcast. Selain itu, terdapat
proses scatter yang menampilkan data angka sebagian yang mendekati rank nya. Lalu
terdapat pula reduce yang melakukan penggabungan data dan penjumlahan data secara
parsial maupun universal. Dan juga terdapat gather yang melakukan penggabungan data
angka 0 hingga 19.