Anda di halaman 1dari 5

TUGAS PEMROSESAN PARALEL

MPI COLLECTIVE COMMUNICATION

Dosen Pembimbing
Heri Wijayanto, ST.,MT., Ph.D.

Nama : Nurul Fitriani


NIM : F1D021128
Kelas :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)

print('Proses {} mempunyai data:'.format(rank), data)


Pada script diatas terdapat pengkondisian “if” yang dimana apabila rank belum
memiliki data maka akan diisi dengan data array 1 dimensi yang dimulai dari angka 0
hingga 19. Lalu terdapat pula pengkondisian “else” yang dimana selain dari
pengkondisian “if” maka variabel data dibuat untuk menampung nilai pada program.
Kemudian terdapat perintah “comm.Bcast(data, root=0)” yang digunakan untuk
melakukan proses broadcast pada program dengan parameter “data” dan “root = 0”.
Lalu terdapat perintah print yang digunakan untuk menampilkan data broadcast pada
proses ke 0 sampai ke 7.
if rank == 0:
sendbuf = np.arange(20.0)

ave, res = divmod(sendbuf.size, size)


count = [ave + 1 if res > x else ave for x in range(size)]
count = np.array(count)

displacement = [sum(count[:x]) for x in range(size)]


displacement = np.array(displacement)
else:
sendbuf = None
count = np.zeros(size, dtype=np.int32)
displacement = None

comm.Bcast(count, root=0)

recvbuf = np.zeros(count[rank])

comm.Scatterv([sendbuf, count, displacement, MPI.DOUBLE], recvbuf,


root=0)
print('Setelah Scatter, proses {} mempunyai data:'.format(rank),
recvbuf)
Pada script diatas terdapat pengkondisian “if” apabila rank bernilai 0 maka dibuat
variabel “sendbuf” yang digunakan untuk menampung data array 1 dimensi dari angka 0
hingga 19. Lalu dibuat variabel “ave” dan “res” yang digunakan untuk menyimpan nilai
dari fungsi “divmod()” atau sisa pembagian yang dimana “sendbuf.size” akan menjadi
dividen sedangkan “size” akan menjadi divisor. Kemudian dibuat variabel “count” yang
akan menampung nilai variabel “ave” ditambah 1 jika nilai dari “res” lebih besar dari “x”
dan apabila selain dari itu maka akan menampilkan nilai variabel “ave” dengan perulangan
“x” dalam rentang “size” dan selanjutnya variabel “count” akan menyimpan nilai dalam
bentuk array dengan parameter nilai “count” itu sendiri. Selanjutnya akan dibuat variabel
“displacement” dalam bentuk array dengan nilai variabel “count” yang dijumlahkan
dengan menggunakan fungsi “sum()”. Selain dari itu, apabila variabel “sendbuf” dan
“displacement” bernilai kosong serta dibuat variabel kosong yaitu “count” maka
“comm.Bcast” akan dipanggil dengan parameter “count” dan “root=0” dan perintah
“comm.Scatterv” akan dipanggil untuk menampilkan nilai dalam proses scatter.
sendbuf2 = recvbuf
recvbuf2 = np.zeros(sum(count))
comm.Gatherv(sendbuf2, [recvbuf2, count, displacement, MPI.DOUBLE],
root=0)

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.

Anda mungkin juga menyukai