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.
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
Bir sonraki yazımda görüşmek üzere...
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...