Anda di halaman 1dari 3

Module 3: Dynamic receiving menggunakan MPI_Status

Tujuan Praktikum:
Memahami fungsi MPI routine MPI_Status
Alat dan Bahan:
PC atau Laptop
Sistem operasi Linux atau Windows
C/C++ compiler, mpicc/mpic++ compiler
Text editor
Teori Singkat:
Seperti yang telah dipelajari sebelumnya, penggunaan MPI_Send dan MPI_Recv untuk melakukan
komunikasi standar point-to-point. Operasi MPI_Recv mengambil alamat dari MPI_Status sebagai
argument. Jika kita memindahkan struktur MPI_Status menjadi fungsi MPI_Recv, MPI_Recv akan
diisi dengan informasi tambahan tentang operasi penerimaan setelah operasi selesai. Bagian utama dari
informasi meliputi:
1. Peringkat pengirim (the rank of the sender).
Peringkat pengirim disimpan di element MPI_SOURCE dari struktur program. Maka jika kita
mendeklarasikan variable MPI_Status stat, peringkat (rank) dapat diakses menggunakan
stat.MPI_SOURCE
2. Tanda pesan (the tag of the message)
Tanda (tag) sebuah pesan dapat diakses menggunakan element MPI_TAG dari struktur program
(mirip dengan MPI_SOURCE)
3. Panjang pesan (the length of the message)
Tidak ada element yang mendefinisikan panjang pesan. Maka kita dapat menghitung panjang
pesan menggunakan MPI_Get_Count
Syntax: MPI_Get_count(MPI_Status*
int* count)

status,

MPI_Datatype

datatype,

Dalam MPI_Get_Count, user melewati struktur MPI_Status , tipedata pesan yang dikirim, dan
mengembalikan nilai variable count. Variable count merupakan jumlah total dari element tipedata
yang diterima.
Tugas praktikum:

Mengetik barisan program dibawah pada text editor dan meng-compile nya
Memahami barisan code dan output program, serta menuliskan laporan berupa ringkasan logika
setiap potongan program pada lembar laporan, dan dikumpulkan kepada asisten.

Program 1:
#include
#include
#include
#include

<mpi.h>
<stdio.h>
<stdlib.h>
<time.h>

int main(int argc, char** argv) {


MPI_Init(NULL, NULL);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
if (world_size != 2) {
fprintf(stderr, "Must use two processes for this example\n");
MPI_Abort(MPI_COMM_WORLD, 1);
}
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
const int MAX_NUMBERS = 100;
int numbers[MAX_NUMBERS];
int number_amount;
if (world_rank == 0) {
// Pick a random amont of integers to send to process one
srand(time(NULL));
number_amount = (rand() / (float)RAND_MAX) * MAX_NUMBERS;
// Send the amount of integers to process one
MPI_Send(numbers, number_amount, MPI_INT, 1, 0, MPI_COMM_WORLD);
printf("0 sent %d numbers to 1\n", number_amount);
} else if (world_rank == 1) {
MPI_Status status;
// Receive at most MAX_NUMBERS from process zero
MPI_Recv(numbers, MAX_NUMBERS, MPI_INT, 0, 0, MPI_COMM_WORLD,
&status);
// After receiving the message, check the status to determine how
many
// numbers were actually received
MPI_Get_count(&status, MPI_INT, &number_amount);
// Print off the amount of numbers, and also print additional
information
// in the status object
printf("1 received %d numbers from 0. Message source = %d, tag =
%d\n",
number_amount, status.MPI_SOURCE, status.MPI_TAG);
}
MPI_Barrier(MPI_COMM_WORLD);
MPI_Finalize();
}
// compile: mpicc -o status statuscount.c

// try: mpirun -n 4 status


//Must use two processes for this example
//Must use two processes for this example
//Must use two processes for this example
//Must use two processes for this example
//
// mpirun -n 2 status
// 1 received 52 numbers from 0. Message source = 0, tag = 0
//0 sent 52 numbers to 1

Anda mungkin juga menyukai