MPI - Broadcast

Kategori: Parallel Programming , 22 Ekim 2019 , JanFranco


Broadcast, bir root process'ten, diğer tüm process'lere data aktarımı yapar. MPI_Bcast fonksiyonu ile kullanılır. Parametreleri açıklayalım:


MPI_Bcast(
    void* data,			// Dağıtılacak data
    int count,			// Data boyutu, eleman sayısı
    MPI_Datatype datatype,	// Data tipi	
    int root,			// Root
    MPI_Comm communicator)	// Hangi dünya
Bcast fonksiyonu basitçe MPI_Send ve MPI_Recv fonksiyonlarını kullanır. Bcast fonksiyonunu kendimiz de oluşturabiliriz:


void my_bcast(void* data, int count, MPI_Datatype datatype, int root, MPI_Comm communicator) {

  int world_rank, world_size;
  MPI_Comm_rank(communicator, &world_rank);
  MPI_Comm_size(communicator, &world_size);

  if (world_rank == root) {
    int i;
    for (i=0; i<world_size; i++) {
      if (i != world_rank) {
        MPI_Send(data, count, datatype, i, 0, communicator);
      }
    }
  } else {
    MPI_Recv(data, count, datatype, root, 0, communicator, MPI_STATUS_IGNORE);
  }
}
Bcast ile aynı parametreleri kullanan bir fonksiyon oluşturduk. if else bloğunda şu işlemi yaptık: Eğer process id yani world_rank, parametre olarak gönderdiğimiz root'a eşite (örneğin root = 0), for döngüsü ile tüm process'lere Send fonksiyonunu kullanarak data yollayacak. Else kısmında ise tüm process'ler bu datayı root'tan alacak. Ancak yazdığımız bu fonksiyon Bcast fonksiyonuna göre çok basit kaldı. Düşük process'li world'lerde sıkıntı olmayacaktır my_bcast de Bcast de hemen hemen aynı performansı verecektir ancak process sayısı arttıkça my_bcast fonksiyonumuz çok etkisiz kalacaktır. Bunun sebebi Bcast fonksiyonu kendi içinde bir ağaç algoritması kullanır:


            0
             \
    0         1
     \         \
0     2    1    3
 \     \    \    \
  4     6    5    7
Bu ağaç yapısında process 0, process 1'e data gönderir. İkinci aşamada process 0, process 2'ye data gönderir ve data alan process 1, aldığı datayı process 3'e gönderir. Yani mantık olarak process 0 yani root sırayla tüm process'lere data göndermek yerine sadece belli process'lere gönderir ve bu process'lerde bu data kopyalanarak diğer process'lere aktarılır.


Sonraki Yazı: MPI - Scatter, Gather
Yorumlar

Henüz bir yorum bulunmuyor.
Yorum bırakın