TUGAS AKHIR MATA KULIAH PEMROSESAN PARALEL ALGORITME FOX UNTUK PERKALIAN MATRIKS
Disusun Oleh: Kelompok 6 Auriza Rahmad Akbar Rifki Yusri Haidar Hasanul Fajri Nuras Fathoni Arief Musyaffa
G64050089 G64050964 G64051421 G64053198
DEPARTEMEN ILMU KOMPUTER FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM INSTITUT PERTANIAN BOGOR BOGOR 2009
|i
Daftar Isi No Daftar Isi .............................................................................................................................. ii Daftar Gambar ................................................................................................................... iii 1.
Pendahuluan ............................................................................................................... 1 1.1. Latar Belakang .......................................................................................................... 1 1.2. Dasar Teori ............................................................................................................... 1 1.2.1. Algoritme Sekuensial........................................................................................ 1 1.2.2. Algoritme Paralel............................................................................................... 2
2. Metode Foster................................................................................................................. 4 2.1. Partisi Data ............................................................................................................... 4 2.2. Komunikasi ............................................................................................................... 5 2.3. Aglomerasi ............................................................................................................... 7 2.4. Mapping ................................................................................................................... 7 3.
Analisis Kerja dan Kompleksitas .................................................................................. 8 3.1 Kompleksitas ............................................................................................................. 9 3.1.1. Analisis Kompleksitas dalam Satu Iterasi .......................................................... 9 3.1.2. Kompleksitas Waktu dalam Satu Iterasi ........................................................... 9 3.1.3. Kompleksitas Waktu dalam π Iterasi ............................................................. 9 3.2 Speedup .................................................................................................................... 9 3.3 Efisiensi ................................................................................................................... 10 3.4 Isoefisiensi ............................................................................................................... 10 3.4.1. Relasi Isoefisiensi ............................................................................................ 10 3.4.2. Fungsi Isoefisiensi ........................................................................................... 10
4. Kode Program ............................................................................................................... 12 4.1. Fungsi Utama (main) ............................................................................................. 12 4.2. Struct GRID_INFO_T ............................................................................................... 13 4.3. Struct LOCAL_MATRIX_T ........................................................................................ 13 4.4. Fungsi Setup_grid................................................................................................... 13 4.5. Fungsi Fox............................................................................................................... 14 Daftar Pustaka................................................................................................................... 15
| ii
Daftar Gambar Halaman Gambar 1. Proses Perkalian Matriks ................................................................................... 2 Gambar 2. Skema Blok Checkerboard ................................................................................. 2 Gambar 3. Pembagian blok-blok matriks untuk P=16 ........................................................ 4 Gambar 4. Proses broadcast pada prosesor π¨π, π ke prosesor lain yang sebaris............... 5 Gambar 5. Perkalian antara matriks π» (matriks π¨π, π yang telah di-broadcast) dan π© ...... 5 Gambar 6. Penggeseran (roll) tiap elemen ke atas pada matriks π© ................................... 6 Gambar 7. Proses broadcast dari prosesor π¨π, (π + π)πππ
π ke prosesor lain yang sebaris. ................................................................................................................................ 6 Gambar 8. Perkalian antara matriks π» dan π© ..................................................................... 6
| iii
1. Pendahuluan 1.1. Latar Belakang Perkalian matriks merupakan salah satu masalah utama dalam perhitungan matriks. Terdapat beberapa algoritme paralel untuk melakukan operasi perkalian matriks ini. Beberapa diantaranya dilakukan berdasarkan pembagian blok checkerboard. Salah satu algoritme yang terkenal adalah algoritme Fox.
1.2. Dasar Teori Perkalian antara matriks π΄π ,π yang terdiri dari π baris dan π kolom dengan matriks π΅π ,π yang terdiri dari π baris dan π kolom akan menghasilkan matriks πΆ dengan π baris dan π kolom. Setiap elemen matriks C dihitung berdasarkan rumus: πβ1
πππ =
πππ β πππ ,
0 β€ π < π, 0 β€ π < π.
π=0
Seperti yang dapat dilihat pada persamaan di atas, setiap elemen matriks πΆ adalah hasil inner product dari baris terkait pada matriks π΄ dan kolom terkait pada matriks π΅. Algoritme mengeksekusi perkalian dan penjumlahan sebanyak π. π. π pada elemen-elemen matriks asal. Pada kasus matriks persegi, dengan ukuran π Γ π, jumlah operasi yang dieksekusi adalah sebesar Ξ(π3 ). Sebenarnya terdapat juga algoritme perkalian matriks sekuensial dengan kompleksitas komputasi yang lebih kecil (contoh: algoritme Strassen). Akan tetapi, mempelajari algoritme semacam itu membutuhkan usaha yang lebih besar dan demi kesederhanaan, akan digunakan algoritme sekuensial yang dijelaskan di atas sebagai dasar untuk pengembangan metode paralel. Diasumsikan bahwa semua matriks yang digunakan adalah matriks persegi dan berukuran π Γ π.
1.2.1. Algoritme Sekuensial Algoritme perkalian matriks sekuensial mencakup tiga nested loop: float A[n][n]; float B[n][n]; float C[n][n]; int i,j,k; ... for (i=0; i
Algoritme tersebut merupakan sebuah prosedur iteratif dan menghitung barisbaris pada matriks πΆ secara sekuensial. Baris matriks πΆ dihitung per iterasi outer loop (variabel loop π). Hal ini ditunjukkan gambar di bawah:
|1
Gambar 1. Proses Perkalian Matriks
Dari gambar tersebut, dapat dilihat bahwa selama iterasi pertama variabel loop π, baris pertama matriks π΄ dan semua kolom matriks π΅ digunakan untuk menghitung elemen-elemen baris pertama matriks πΆ yang dihasilkan. Karena setiap elemen matriks πΆ adalah hasil perkalian skalar dari baris matriks π΄ dan kolom matriks π΅, maka diperlukan operasi sebanyak π2 (ππ) untuk menghitung semua elemen matriks πΆ dengan π adalah operasi dasar dalam perkalian matriks (dalam hal ini perkalian dan penambahan).
1.2.2. Algoritme Paralel Pengulangan operasi perhitungan yang sama untuk elemen matriks yang berbeda merupakan hal yang biasa terjadi untuk metode penghitungan matriks. Dalam hal ini, dapat dikatakan terdapat paralelisme data. Hasilnya, operasi untuk memparalelkan operasi matriks dapat direduksi pada hampir semua kasus dengan mendistribusikan matriks ke tiap prosesor yang ada. Pilihan dalam metode mendistribusikan matriks menentukan penggunaan metode komputasi paralel tertentu. Adanya skema distribusi data yang beragam menghasilkan beberapa algoritme paralel untuk melakukan perhitungan matriks. Metode distribusi matriks yang paling umum dan banyak digunakan terdiri atas pembagian data ke dalam beberapa larik (vertikal dan horizontal) atau bagian-bagian berbentuk persegi (sub-blok). Dalam pembagian sub-blok matriks checkerboard, matriks dibagi menjadi sekumpulan elemen persegi. Cara pembagiannya dijelaskan lebih lanjut pada bagian 2.1. yang membahas tentang partisi data. Tiap prosesor melakukan komputasi sub-bloknya masing-masing. Untuk mendapatkan gambaran secara umum mengenai skema ini, perhatikan gambar di bawah. Misalkan kita memiliki matriks berukuran 8 Γ 8 (π = 8) dan kita akan menggunakan 16 prosesor (π = 16) untuk menghitung perkalian matriks menggunakan skema checkerboard, maka setiap prosesor akan mendapatkan sub-blok π yang berukuran sebesar 2 Γ 2 (π = π = 2).
Gambar 2. Skema Blok Checkerboard
|2
Secara garis besar, algoritme Fox bekerja dalam π iterasi. Dalam setiap iterasi terdapat tiga langkah, yaitu broadcast, multiply, dan roll. Algoritme Fox hampir sama dengan algoritme Cannon. Perbedaannya adalah pada algoritme Cannon pada langkah pertama menggunakan roll, sedangkan algoritme Fox menggunakan broadcast. Penjelasan lebih lanjut tentang algoritme Fox ini terdapat pada bagian 2.2. yang membahas mengenai komunikasi pada algoritme.
|3
2. Metode Foster 2.1. Partisi Data Misalkan kita ingin mengalikan dua buah matriks A dan B untuk membentuk matriks C. πΆ =π΄βπ΅ Diasumsikan semua matriks adalah persegi, sehingga algoritme Fox dapat digeneralisasi untuk memproses matriks persegi. Matriks input π΄ dan π΅ didekomposisi menjadi beberapa sub-blok persegi. Jika kita memiliki π prosesor, kita memiliki sub-blok sebanyak π baris dan kolom. Hal ini berarti π juga harus berbentuk persegi. Satu sub-blok diberikan ke tiap prosesor dalam grid sesuai dengan struktur subblok. Algoritme Fox menjamin bahwa matriks output πΆ memiliki dekomposisi yang sama dengan matriks π΄ dan π΅. Jika π΄, π΅, dan πΆ berukuran π Γ π, maka setiap prosesor menyimpan sub-blok berukuran π Γ π, dengan π = π/ π. Prosesor diberi label (π, π), dengan π, π = 0, 1, β¦ , π β 1. Jika πΆ π,π adalah sub-blok pada posisi (π, π), maka masalah perkalian matriks dapat dinyatakan dalam bentuk blok matriks: πβ1
πΆ π,π =
π΄π,π π΅π,π π=0
Berikut contoh struktur sub-blok untuk matriks A dengan P = 16 ( π = 4). Setiap prosesor mengerjakan 1 sub-blok saja.
Gambar 3. Pembagian blok-blok matriks untuk π=16
|4
2.2. Komunikasi Algoritma Fox bekerja dengan urutan broadcast, multiply dan roll untuk setiap iterasinya. Berikut pseudocode dari algoritma Fox. set πΆ = 0 for (π π‘πππ = 0 βΆ
π β 1) do
Tiap baris prosesor π, mem-broadcast sub-blok π΄π,π ke prosesor lain pada baris yang sama, dengan π = π + π π‘πππ πππ π, setiap prosesor menyimpan subblok broadcast dalam sebuah array π Kalikan sub-matriks temporer π pada tiap prosesor dengan sub-blok π΅ sekarang dan tambahkan hasilnya ke πΆ Setiap prosesor mengirimkan sub-blok π΅ sekarang ke prosesor di atasnya dan menerima sub-blok dari prosesor di bawahnya dan dijadikan sebagai sub-blok π΅ sekarang yang baru. Wrap around dari atas ke bawah. end
Berdasarkan algoritma di atas, kita memerlukan broadcast parsial sepanjang baris dan roll (geser satu) pada kolom. Keduanya merupakan komunikasi kolektif. Rowbroadcast adalah broadcast pada sub-grup khusus dari prosesor. Roll dilakukan sebagai varian dari operasi MPI_Sendrecv dengan kondisi batas melingkar (wrapped). Terdapat juga fungsi MPI khusus untuk mendefinisikan mesh prosesor dua dimensi. Berikut ilustrasi dari komunikasi algoritma Fox. Stage 0 Row Broadcast
Gambar 4. Proses broadcast pada prosesor π¨π,π ke prosesor lain yang sebaris
Multiply
Gambar 5. Perkalian antara matriks π» (matriks π¨π,π yang telah di-broadcast) dan π©
|5
Roll
Gambar 6. Penggeseran (roll) tiap elemen ke atas pada matriks π©
Stage 1 Row broadcast
Gambar 7. Proses broadcast dari prosesor π¨π,(π+π)πππ
π
ke prosesor lain yang sebaris.
Multiply
Gambar 8. Perkalian antara matriks π» dan π©
Matriks hasil penggeseran dari matriks π΄, yaitu matriks π dikalikan dengan matriks π΅ yang telah mengalami penggeseran. Hasil perkalian tadi kemudian dikalikan dengan matriks πΆ yang telah diperoleh sebelumnya.
|6
Tiga langkah di atas (broadcast, multiply dan roll) dilakukan dalam setiap stage sebanyak
π stage. Selanjutnya kita lihat hasil keseluruhan algoritme pada salah satu
blok, yaitu πΆ 21 . π π‘πππ = 0: π π‘πππ = 1: π π‘πππ = 2: π π‘πππ = 3:
β΄
π= πΆ= π= πΆ= π= πΆ= π= πΆ=
π΄22 ; π΅ = π΅21 π΄22 π΅21 π΄23 ; π΅ = π΅31 π΄22 π΅21 + π΄23 π΅31 π΄20 ; π΅ = π΅01 π΄22 π΅21 + π΄23 π΅31 + π΄20 π΅01 π΄21 ; π΅ = π΅11 π΄22 π΅21 + π΄23 π΅31 + π΄20 π΅01 + π΄21 π΅11
πΆ 21 = π΄22 π΅21 + π΄23 π΅31 + π΄20 π΅01 + π΄21 π΅11
2.3. Aglomerasi Algoritme Fox menggunakan skema checkerboard yang merupakan perbaikan dari algoritme perkalian matriks paralel yang berdasarkan skema baris (rowwise). Dengan skema ini sub-tugas diaglomerasi ke dalam satu sub-blok yang diproses oleh satu prosesor. Dengan demikian tugas yang telah diaglomerasi memiliki biaya komputasi dan komunikasi yang sama untuk tiap prosesor. Skema ini juga meningkatkan lokalitas dari algoritme paralel, karena tiap prosesor memproses sub-bloknya masing-masing.
2.4. Mapping Strategi mapping yang digunakan didasari oleh karakteristik algoritme paralel. Karakeristik algoritme Fox antara lain: jumlah tugasnya statis, pola komunikasinya terstruktur, dan waktu komputasi tiap tugas konstan. Dari karakteristik tersebut, maka strategi mapping yang digunakan adalah mengaglomerasi tugas untuk meminimalkan komunikasi dan membuat satu tugas untuk tiap prosesor. Strategi ini sudah diterapkan dalam skema checkerboard. Tiap prosesor bertanggung jawab untuk menghitung hasil perkalian matriks pada satu sub-blok saja. Untuk mengeksekusi algoritme Fox dengan efisien, dimana sub-tugas dasar membentuk grid persegi dan komunikasi data terdiri atas transmisi blok sepanjang baris dan kolom grid sub-tugas, topologi jaringan seharusnya juga berbentuk grid persegi. Dalam kasus ini dimungkinkan untuk memetakan dengan mudah kumpulan sub-tugas ke dalam kumpulan prosesor dengan menempatkan sub-tugas dasar (π, π) pada prosesor π π, π . Struktur yang diperlukan untuk jaringan komunikasi data dapat disediakan pada level fisik, jika topologi jaringannya adalah grid atau graf komplit.
|7
3. Analisis Kerja dan Kompleksitas Dalam analisis kerja algoritme paralel, digunakan istilah sebagai berikut: Jumlah Prosesor, π: Jumlah unit pemrosesan yang sama pada komputer paralel untuk menyelesaikan suatu masalah. Ukuran Masalah, π: Waktu yang diperlukan algoritme serial untuk menyelesaikan masalah yang diberikan pada prosesor tunggal. Hal ini juga sama dengan jumlah total dari semua pekerjaan berguna yang dilakukan oleh seluruh prosesor ketika menyelesaikan masalah yang sama secara paralel menggunakan prosesor sebanyak π. Misalnya, untuk perkalian dua buah matriks π Γ π, dapat dikatakan π = π(π3 ). Waktu Eksekusi Paralel, ππ : Waktu yang diperlukan oleh sebanyak p prosesor untuk menyelesaikan masalah. Untuk sistem paralel yang diberikan, ππ merupakan fungsi dari ukuran masalah dan banyak prosesor. Speedup Paralel, π: Perbandingan antara π dengan ππ Overhead Paralel Total, ππ : Jumlah total dari keseluruhan overhead yang terjadi pada semua prosesor selama eksekusi paralel dari algoritme. Overhead ini termasuk biaya komunikasi, pekerjaan sampingan dan waktu idle sehubungan dengan sinkronisasi dan komponen serial dari algoritme. Untuk sistem paralel yang diberikan, ππ biasanya merupakan fungsi dari ukuran masalah dan banyak prosesor dan sering dituliskan sebagai π0 π, π . Oleh karena itu, π0 π, π = πππ β π. Efisiensi, πΈ: Perbandingan antara π dengan π. Oleh karena itu, πΈ = π πππ = 1
ππ
1+π
Biaya Komunikasi Data, π‘π dan π‘π€ : Pada suatu komputer paralel dengan message passing, waktu yang dibutuhkan untuk menyelesaikan transfer dari suatu pesan yang mengandung π words antara dua prosesor bersebelahan adalah π‘π + π‘π€β π, dengan π‘π merupakan waktu startup pesan, dan π‘π€ (waktu komunikasi per-word) sama dengan
π¦ , π΅
dimana π΅ merupakan bandwidth
saluran komunikasi antar prosesor dalam byte/detik dan π¦ merupakan jumlah byte per word.
|8
3.1 Kompleksitas 3.1.1. Analisis Kompleksitas dalam Satu Iterasi Row-Broadcast (Logaritmik) π π‘ππ
π‘ππππ π‘ = log π π‘π +
πππππ π ππ§π π π β
π π
β
π‘π€
= log π π‘π +
π2 π‘ π π€
Block Multiply π‘ππ’ππ‘ =
π π
β
π π
β
π π
=
π3 π π
Column Roll πππππ π ππ§π
π‘ππππ = π‘π +
π
π
β
π
π
β
π‘π€ = π‘π +
π2 π‘ π π€
3.1.2. Kompleksitas Waktu dalam Satu Iterasi π1 = π‘ππππ π‘ + π‘ππ’ππ‘ + π‘ππππ =
π3 π π
+ (log π + 1) π‘π +
π2 π
=
π3 π π
+ log 2 π π‘π +
π2 π
β
π‘π€
=
π3 π π
+ log 4π π‘π +
π2 π
β
π‘π€
β
π‘π€
3.1.3. Kompleksitas Waktu dalam π Iterasi ππ = π1 β
π = ππ =
π3 + log 4π π π3 π
π. π‘π +
π2
+ π log 4π . π‘π +
ππππ
π π2 π
β
π‘π€ log 4π . π‘π€
πππππ’πππππ‘πππ
3.2 Speedup π=
π = ππ π3 π +
π3 π log 4π . π‘π +
π2 log 4π . π‘π€ π
|9
3.3 Efisiensi πΈ=
π π3 = πππ π3 + π π log 4π . π‘π + π2 π log 4π . π‘π€
3.4 Isoefisiensi 3.4.1. Relasi Isoefisiensi Untuk mempertahankan efisiensi yang konstan, π harus proporsional terhadap ππ π, π , atau relasi di bawah ini harus terpenuhi: π = πΎππ π, π πΈ
Di sini πΎ = 1βπΈ adalah konstan, tergantung pada efisiensi yang ingin dipertahankan. Persamaan di atas adalah relasi utama yang digunakan untuk menentukan fungsi isoefisiensi. Overhead Total ππ π, π = π. ππ β π = π1.5 . log(4π)0.5 . π‘π + π2 π0.5 . log(4π)0.5 . π‘π€ π π‘πππ‘π’π
πππ‘π π‘ππππ πππ
Isoefisiensi Terhadap ππ π3 = π β πΎ. π1.5 . log(4π)0.5 . π‘π Isoefisiensi Terhadap ππ π3 = π β πΎ. π2 π0.5 . log(4π)0.5 . π‘π€ β π β πΎ. π0.5 . log(4π)0.5 . π‘π€ β π3 = π β πΎ 3 . π1.5 . log 3 (4π)0.5 . π‘π€ 3
3.4.2. Fungsi Isoefisiensi Fungsi efisiensi dalam sistem paralel umumnya berupa fungsi polinomial dari π, yaitu Ξ(π π₯ ), dimana π₯ < 1. Pangkat π yang kecil dalam fungsi esoefisiensi menandakan skalabilitas yang tinggi. Menurut persamaan isoefisiensi di atas dari π‘π dan π‘π€ , fungsi isoefisiensi asimtotik untuk algoritme Fox adalah Ξ π1.5 . log 3 (4π)0.5 . Fungsi isoefisiensi ini didapat dari algoritme Fox yang menggunakan skema broadcast logaritmik dengan fungsi MPI_Bcast.
| 10
Menurut Fox et al. hasil tersebut dapat ditingkatkan dengan menggunakan skema pipe-broadcast sehingga menghasilkan fungsi efisiensi Ξ π1.5 . Terlebih lagi jika komunikasi dilakukan dengan cara asynchronous, komunikasi dan komputasi dapat dilakukan bersamaan, sehingga mengurangi waktu eksekusi sampai hampir dua kali lebih cepat daripada algoritme Cannon. Fungsi isoefisiensi di atas berarti jika jumlah prosesor bertambah dari π menjadi πβ², ukuran masalah π (dalam hal ini π3 ) harus bertambah sebesar πβ²1.5 π1.5 kali lipat untuk mendapatkan efisiensi yang sama seperti dengan jumlah prosesor sebanyak π. Misalnya jumlah prosesor bertambah dari 4 menjadi 16, maka ukuran masalah harus bertambah sebesar 64/8 = 8 kali lipat. Atau dengan kata lain ukuran matriks (π) harus bertambah sebanyak dua kali lipat (8π3 = (2π)3 ).
| 11
4. Kode Program Kode program yang ditampilkan hanyalah modul utama dari program paralel. Beberapa fungsi pembantu tidak ditampilkan. Meskipun demikian, proses algoritme Fox dapat dipahami tanpa menampilkan fungsi tersebut.
4.1. Fungsi Utama (main) Fungsi utama mengimplementasikan skema komputasi dengan pemanggilan sekuensial pada subprogram yang diperlukan. LOCAL_MATRIX_T* temp_mat; int main(int argc, char* argv[]) int p; // int my_rank; // GRID_INFO_T grid; // LOCAL_MATRIX_T* local_A; LOCAL_MATRIX_T* local_B; LOCAL_MATRIX_T* local_C; int n; // int n_bar; //
{ Number of processes Rank of process Grid info of process
Order of matrix Order of submatrix
void Setup_grid(GRID_INFO_T* grid); void Fox(int n, GRID_INFO_T* grid, LOCAL_MATRIX_T* local_A, LOCAL_MATRIX_T* local_B, LOCAL_MATRIX_T* local_C); MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); MPI_Comm_size(MPI_COMM_WORLD, &p); Setup_grid(&grid); // Setup the grid info of process if (my_rank == 0) { printf("What's the order of the matrices?\n"); scanf("%d", &n); } MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); n_bar = n/grid.q; local_A = Local_matrix_allocate(n_bar); Order(local_A) = n_bar; Generate_matrix("Generate A", local_A, &grid, n); Print_matrix("Matrix A =", local_A, &grid, n); local_B = Local_matrix_allocate(n_bar); Order(local_B) = n_bar; Generate_matrix("Generate B", local_B, &grid, n); Print_matrix("Matrix B =", local_B, &grid, n); Build_matrix_type(local_A); temp_mat = Local_matrix_allocate(n_bar); local_C = Local_matrix_allocate(n_bar); Order(local_C) = n_bar; Fox(n, &grid, local_A, local_B, local_C); Print_matrix("The product is", local_C, &grid, n); Free_local_matrix(&local_A); Free_local_matrix(&local_B); Free_local_matrix(&local_C); return MPI_Finalize(); }
| 12
4.2. Struct GRID_INFO_T Struktur ini menyimpan informasi grid, sehingga pengiriman parameter pada fungsi lebih singkat dan mudah. typedef struct GridInfo { int p; /* Total number of processes MPI_Comm comm; /* Communicator for entire grid MPI_Comm row_comm; /* Communicator for my row MPI_Comm col_comm; /* Communicator for my col int q; /* Order of grid int my_row; /* My row number int my_col; /* My column number int my_rank; /* My rank in the grid comm } GRID_INFO_T;
*/ */ */ */ */ */ */ */
4.3. Struct LOCAL_MATRIX_T Struktur ini menyimpan informasi matriks, sehingga pengoperasian matriks menjadi lebih mudah. #define MAX 65536 typedef struct LocalMatrix { int n_bar; #define Order(A) ((A)->n_bar) float entries[MAX]; #define Entry(A,i,j) (*(((A)->entries) + ((A)->n_bar)*(i) + (j))) } LOCAL_MATRIX_T;
4.4. Fungsi Setup_grid Fungsi ini akan membuat komunikator dua dimensi dalam grid persegi, menentukan koordinat tiap prosesor, dan membuat komunikator untuk tiap baris dan kolom secara terpisah. void Setup_grid( GRID_INFO_T* int old_rank; int dimensions[2]; int wrap_around[2]; int coordinates[2]; int free_coords[2];
grid
/* out */) {
/* Set up Global Grid Information */ MPI_Comm_size(MPI_COMM_WORLD, &(grid->p)); MPI_Comm_rank(MPI_COMM_WORLD, &old_rank); /* We assume p is a perfect square */ grid->q = (int) sqrt((double) grid->p); dimensions[0] = dimensions[1] = grid->q; /* We want a circular shift in second dimension. */ /* Don't care about first */ wrap_around[0] = wrap_around[1] = 1; MPI_Cart_create(MPI_COMM_WORLD, 2, dimensions, wrap_around, 1, &(grid->comm)); MPI_Comm_rank(grid->comm, &(grid->my_rank)); MPI_Cart_coords(grid->comm, grid->my_rank, 2, coordinates); grid->my_row = coordinates[0];
| 13
grid->my_col = coordinates[1]; /* Set up row communicators */ free_coords[0] = 0; free_coords[1] = 1; MPI_Cart_sub(grid->comm, free_coords, &(grid->row_comm)); /* Set up column communicators */ free_coords[0] = 1; free_coords[1] = 0; MPI_Cart_sub(grid->comm, free_coords, &(grid->col_comm)); }
4.5. Fungsi Fox Fungsi ini akan menjalankan algoritme Fox untuk perkalian matriks. Pada tiap stage dilakukan tiga langkah, yaitu broadcast, multiply, dan roll. void Fox( int GRID_INFO_T* LOCAL_MATRIX_T* LOCAL_MATRIX_T* LOCAL_MATRIX_T* LOCAL_MATRIX_T* int int int int int MPI_Status
n grid local_A local_B local_C
/* /* /* /* /*
in in in in out
*/, */, */, */, */) {
temp_A; /* Storage for the sub/* matrix of A used during /* the current stage stage; bcast_root; n_bar; /* n/sqrt(p) source; dest; status;
*/ */ */ */
n_bar = n/grid->q; Set_to_zero(local_C); /* Calculate addresses for circular shift of B */ source = (grid->my_row + 1) % grid->q; dest = (grid->my_row + grid->q - 1) % grid->q; /* Set aside storage for the broadcast block of A */ temp_A = Local_matrix_allocate(n_bar); for (stage = 0; stage < grid->q; stage++) { bcast_root = (grid->my_row + stage) % grid->q; if (bcast_root == grid->my_col) { MPI_Bcast(local_A, 1, local_matrix_mpi_t, bcast_root, grid->row_comm); Local_matrix_multiply(local_A, local_B, local_C); } else { MPI_Bcast(temp_A, 1, local_matrix_mpi_t, bcast_root, grid->row_comm); Local_matrix_multiply(temp_A, local_B, local_C); } MPI_Sendrecv_replace(local_B, 1, local_matrix_mpi_t, dest, 0/* sendtag*/, source, 0/*recvtag*/, grid->col_comm, &status); } }
| 14
Daftar Pustaka Fox G. 2005. Parallel Matrix Multiplication and other Full Matrix Algorithms. Indiana: Indiana University Gupta A, Kumar V. Scalability of Parallel Algorithm for Matrix Multiplication. Minnesota: University of Minnesota Quinn M. 2003. Parallel Programming in C With MPI and OpenMP. New York : McGraw Hill
| 15