Paralel Programlama VI (Parallel Programming VI)

watch_later 4/21/2016
Kolektif Haberleşme (Collective Communication)
Kolektif haberleşme, bir grup node arasında verilerin gönderilmesini ve alınmasını kapsar. Genel olarak düşünüldüğünde, kolektif haberleşme rutinleri kullanılmaksızın yapılacak tüm işlemler MPI_Send ve MPI_Recv fonksiyonları kullanılarak yapılabilir. Fakat kolektif haberleşme fonksiyonları, bu işlemlerin çok daha kısa bir şekilde yapılmasını sağlar. Ayrıca noktadan noktaya haberleşmeden farklı olarak kolektif haberleşme fonksiyonları yardımıyla, bir node’un birden fazla node’a (one to several) ya da diğer node’ların herhangi bir node’a (several to one) veri transferi yapmasına olanak sağlanır.

Kolektif haberleşmenin kullanılması ile program içinde yazılacak MPI kodlarında önemli ölçüde bir azalma olur. Bu ise, program yazılması sırasında yapılacak hatalarının azalması anlamında gelir. Ayrıca kolektif haberleşme rutinleri kullanılması ile node’lar arası yapılan haberleşmeler azaldığından çalıştırılan programın daha kısa sürede tamamlanması sağlanabilmektedir.


Kolektif haberleşme rutinleri bütün prosesler tarafından işletilmesi gereken rutinlerdir. Bu özellikleri dolayısıyla if deyimleri kullanılarak rankler tarafından işletilmesi gereken noktadan noktaya haberleşme rutinlerinden ayrılırlar. Bütün kolektif haberleşme rutinleri noktadan noktaya haberleşme rutinleri kullanılarak uygulanabilir. Örneğin MPI_Bcast rutini bir for döngüsü içinde root process tarafından diğer bütün proseslere MPI_Send işlemi ile gerçekleştirilebilen bir işlem gibi düşünülebilir. Ancak böyle bir yöntem optimizasyonu sağlamamaktadır.

Kolektif Haberleşme Rutinleri (Collective Communication Routines)

MPI_Reduce(data, result, count, type, op, root,comm) 
Bu fonksiyon n tane makinede oluşmuş sonuçları derleyerek ana işlemcide result dizisinde saklamaktadır. Diğer değişkenlerden count reduce (alınmış veri) sayısını, type alınan verilerin türlerini, op yapılan alma işlemlerinin sonuçlarını, root verilerin alındığı işlemcileri ve son olarak comm haberleşme ortamının adını yani MPI_COMM_WORLD almaktadır.

  

MPI_Allreduce(data, result, count, type, op, root,comm)
Allreduce() rutini Reduce() ile işlevsel olarak aynıdır. Tek farkı bütün işlemcilere result değerini göndermektedir. Parametreleri root haricinde aynı işlevleri yapar.



MPI_Barrier(comm) 
Bu fonksiyon, node’lar arasındaki senkronizeliği sağlamak amacıyla kullanılır ve her bir node herhangi bir işlem yapmadan önce diğer node’ların belirlenen sürece kadar beklemesini sağlar. Parametresi olan comm haberleşme ortamının adını yani MPI_COMM_WORLD almaktadır.

MPI_Bcast(&buffer,count,datatype,root,comm) 
Broadcast fonksiyonu ile ana node’daki istenilen bir veri, haberleşme grubu içinde yer alan diğer tüm node’lara dağıtılır. Parametrelerinden buffer yayın yapılacak verileri, count veri sayısını, type alınan verilerin türlerini, root verilerin alındığı işlemciyi ve son olarak comm haberleşme ortamının adını yani MPI_COMM_WORLD almaktadır.

  
MPI_Gather(*sendbuf, sendcnt, sendtype, *recvbuf, recvcount, recvtype, root, comm)
MPI_Gather() rutini her bir node’daki verileri ana node’a kopyalanmasını sağlar. 



  MPI_Gather.cpp

MPI_Allgather(*sendbuf, sendcnt, sendtype, *recvbuf, recvcount, recvtype, comm)
Allgather() rutini Gather() ile işlevsel olarak aynıdır. Tek farkı bütün işlemcilere sendbuf değerini göndermektedir. Parametreleri root haricinde Gather() rutini ile aynı işlevleri yapar.



MPI_Scatter(*sendbuf, sendcnt, sendtype, *recvbuf, recvcnt, recvtype, root, comm)
MPI_Scatter rutini, ana node’da bulunan dizi elemanlarının sırası ile diğer node’lara dağıtılması amacıyla kullanılır. Burada dağıtma işlemi, ana node’dan başlar ve node rankına göre sırası ile devam eder.
 MPI_Scatter.cpp



Parametreleri (Parameters)
sendbuf send buffer başlangıç adresini, sendcount send buffer eleman sayısını, sendtype send buffer elemanlarının veri tipini, recvbuf receive buffer adresini, recvcount tek alıcı için receive buffer eleman sayısını, recvtype receive buffer elemanlarının veri tipini, root verilerin alındığı işlemciyi son olarak comm haberleşme ortamının adını yani MPI_COMM_WORLD değerini almaktadır.





Bir sonraki yazımda görüşmek üzere...



sentiment_satisfied Emoticon