Programlama | Programlama Dilleri | C Programlama Dili |C++

Hata
  • XML Parsing Error at 1:82. Error 9: Invalid character
Anasayfa MPI ile Paralel Programlama


MPI ile Paralel Programlama

MPI ?LE PARALEL PROGRAMLAMA

 

MPI ile Dinamik Yük Da??l?m? Uygulamas?

 


 

MPI Nedir?

Message Passage Interface: Da??t?k bellekli, mesaj geçmeli paralel hesaplamalarda standart olu?turabilecek mesaj geçme kütüphaneleri için bir tan?mlamad?r.

MPI’?n hedefi mesaj geçmeli programlar yazmak için geni? kullan?ma sahip bir standart sa?lamakt?r. Arayüz; mesaj geçme için pratik, ta??nabilir, etkin ve esnek bir standart kurmaya çal???r.

 

MPI Kullanman?n Nedenleri

-                    Standartla?t?rma: MPI, standart say?labilecek tek mesaj geçme kütüphanesidir. Bütün HPC platformlar?nda desteklenmi?tir.

-                    Ta??nabilirlik: MPI destekleyen ba?ka bir platforma uygulaman?z? ta??d???n?z zaman kodunuzu de?i?tirmeye gerek yoktur.

-                    Performans: Sat?c? implementasyonlar? performans? optimum edebilmek için donan?m özelliklerini en üst düzeyde kullanabilecek ?ekildedir.

-                    Fonksiyonellik: 115’in üzerinde rutin ile.

-                    Kullan?rl?k: Bir çok implementasyonu vard?r.

 

Mesaj Geçme Modeli

Da??t?k Bellek: Her i?lemci sadece kendi CPU’su ile direk olarak eri?ilebilece?i yerel belle?e sahiptir. Bir i?lemciden di?erine veri iletimi a? üzerinden gerçekle?tirilir.

Mesaj Geçme: Verinin bir i?lemcinin belle?inden di?er bir i?lemcinin belle?ine kopyaland??? yöntemdir. Da??t?k bellekli sistemlerde veri genellikle bir i?lemciden di?erine a? üzerinden bilgi paketleri olarak yollan?r. Bir mesaj bir veya daha çok bellekten olu?abilir ve ço?unlukla yönlendirme ya da ba?ka kontrol bilgileri içerir.

Mesaj Geçme Kütüphanesi: Uygulama kodunun içine gömülen bir rutin kümesini belirtir.

Send/Receive: Mesaj geçme verinin bir süreçten di?er bir sürece transfer olmas?n? icap ettirir. Yollayan ve alan süreçlerin birlikte çal??mas?n? gerektirir. Send i?lemleri genellikle yollayan sürecin verinin yeri, boyu, tipi ve hedefi bilgilerini belirtmesini gerektirir. Receive i?lemleri ili?kili Send i?lemi ile e?le?melidir.

Senkron / Asenkron: Senkron send i?lemi al?c? process’in mesaj? güvenli bir ?ekilde ald???n? belirten onay?ndan sonra sonlanacakt?r. Asenkron send i?lemleri al?c? süreç mesaj? almadan tamamlanabilir.

Uygulama Tamponu: Yollanacak veya al?nacak veriyi tutan adres uzay?d?r.

Sistem Tamponu: Mesajlar? tutmak için kullan?lan sistem uzay?d?r. Sen/Receive i?lemine ba?l? olarak uygulama tamponundaki veri, sistem tampon uzay?ndan kopyalanmak zorunda kalabilir. Haberle?menin asenkron olmas?na izin verir.

Blocking Communication

E?er ça?r?n?n tamamlanmas? belirli bir olaya ba?l? ise haberle?me rutini bloklan?r. Göndermeler için, veri ba?ar? ile yollanmal? veya sistem tampon uzay?na güvenli bir ?ekilde kopyalanmal?d?r. Al?c? için veri, al?c? tamponunda depolanmal?d?r. Böylece veri kullanmak için haz?r olacakt?r.

 

Non-Blocking Communication

E?er ça??rma herhangi bir haberle?me olay?n?n tamamlanmas?n? beklemeden dönüyorsa haberle?me rutini bloklanmayand?r.

Bloklanmayan haberle?meler performans? artt?rmak amac?yla hesaplamay? haberle?me ile üst üste getirmek için kullan?l?rlar.

 

?leticiler ve Gruplar

MPI hangi süreç kümelerinin hangileri ile haberle?ece?ini belirtmek için, communicator ve group ad?nda nesneler kullan?rlar. Ço?u MPI rutinleri communicator’? argüman olarak belirtmenizi gerektirir.

MPI_COMM_WORLD, bütün MPI süreçlerini içeren önceden tan?ml? ileticidir.

Rank

?leticinin içinde, her süreç ba?lat?mland???nda sistem taraf?ndan atanan kendi e?siz integer belirtecine sahiptir. Rank bazen “process ID” olarak da adland?r?labilirler. Ranklar s?ral?d?r ve 0’dan ba?larlar.

Programc? taraf?ndan mesaj?n kayna??n? ve hedefini belirtmek için kullan?l?rlar. Bir çok zaman program icras?n? kontrol için uygulama taraf?ndan ?artl? olarak kullan?l?rlar. (if rank==0 do this / if rank==1 do that)

 

MPI’a Giri?

 

MPI kütüphane fonksiyonlar?n? kullanmak için header dosyas?n? include etmeliyiz.

#include "mpi.h"

 

MPI Ça?r?lar?n?n format? ?u ?ekildedir:

rc = MPI_Xxxxx(parameter, ... )

 

Genel MPI Program? Yap?s? ?u ?ekilde olmaktad?r:

 

MPI include file

 


.
.

 

Initialize MPI environment

 


.
.

 

Do work and make message passing calls

 


.
.

 

Terminate MPI Environment

 

Yayg?n Kullan?lan MPI Fonksiyonlar?:

MPI_Init(&argc,&argv) 

MPI_Init fonksiyonunu bütün kodlar?n?za eklemeniz gerekmektedir. MPI_Init fonksiyonuna komut sat?r?ndan da parametre verebilirsiniz ama mecbur de?ilsiniz. MPI_Init size bir de?er dönmektedir bu “MPI_SUCCESS” olursa kod geri kalan MPI_X fonksiyonlar?n? kullanabilecektir, e?er bu de?er dönmezse MPI_X fonksiyonlar?n? kullanamazs?n?z.

MPI_Comm_size(comm,&size) 

Bu fonksiyonumuz proses say?s?n? bize vermektedir. Genellikle “comm” k?sm?na MPI_COMM_WORLD üst fonksiyonu yaz?lmaktad?r.

MPI_Comm_rank(comm,&rank)

Bu MPI fonksiyonu ça??ran prosesin s?ras?n? vermektedir. Ba?lang?çta bütün prosesler 0 veya -1 de?erlerini almaktad?r. Daha sonra MPI taraf?ndan s?raya sokulunca bütün prosesler numaraland?r?lmaktad?r. A?a??da ki örne?imizde görece?imiz gibi makineler 0 dan ba?layarak rank(s?ra) alacaklard?r.

MPI_Abort (comm,errorcode)

Ad?ndan da anla??ld??? gibi bütün prosesleri durdurmaktad?r. Istenmeyen durumlarda ba?vurulabilecek bir fonksiyondur.

MPI_Get_processor_name(&name,&resultlength)

??lemcinin ad?n? ve ad?n uzunlu?unu dönmektedir.

MPI_Initialized(&flag) 

MPI_Init fonksiyonun ça??r?l?p ça??r?lmad???n? kontrol etmektedir ve ça??r?ld?ysa “1” dönmektedir. MPI_Init her proses taraf?ndan sadece bir kere ça??r?lmas? gerekti?i için MPI_Initialized fonksiyonu olas? çak??malar? önlemektedir.

MPI_Wtime( ) 

Double deger olarak paralel kodun çal??maya ba?lamas?ndan sonra geçen zaman? vermektedir.

MPI_Finalize( )

Bütün i?lemlerimizden sonra MPI_Finalize diyerek i?lemlerimizi sonland?r?yoruz.

MPI_Send(&buffer,count,datatype,dest,tag,comm) 

MPI_Recv(&buffer,count,datatype,source,tag,comm,status) 

Fonksiyonlar?m?z burada de?i?ik parametreler almaktad?r bunlardan buffer yollanacak veya al?nacak verinin adresini göstermektedir. Count parametresi yollanacak verilerin say?s?n? belirtmektedir. Datatype parametresi gidecek verinin türünü belirtmektedir (int,float,char,...). Dest parametresi verinin hangi makineye gidece?ini belirtmektedir. Source parametresi verinin hangi makineden alaca??n? belirtmektedir.Tag parametresi ise 0-32767 aras? say?sal bir de?er al?r ve kullan?c? taraf?ndan yanl?? makinelerden mesajlar gelmesini önlemek için verilebilecek bir tür güvenlik kodudur. SEND ve RECV fonksiyonlar?nda tag’ lerin e?it olmas? gerekmektedir.Comm de?i?keni olarak genelde MPI_COMM_WORLD kullan?lmaktad?r. Grup haberle?me fonksiyonlar?nda de?i?ik “comm” de?erleri kullan?lmaktad?r. ?u anl?k bu de?er yeterlidir. Grup haberle?me fonksiyonlar?nda ise comm parametresi birden fazla de?er alabilir. En son parametre de?erimiz ise RECV fonksiyonundaki status de?eridir. Status mesaj?n geldi?i kayna?? bize bildirmektedir.

SEND/RECV fonksiyonlar?m?z?n d???nda i?imize yarayabilecek ba?ka fonksiyonlarda vard?r bunlar? k?saca inceleyecek olursak;

MPI_Isend(&buffer,count,datatype,dest,tag,comm) 

MPI_Irecv(&buffer,count,datatype,source,tag,comm,status)

Yukar?da gördü?ünüz komutlar?n Send ve Recv fonksiyonlar?ndan tek fark? “I” (Immediate) yani beklemeksizin veri al??veri?lerin olmas?d?r. Sizin de tahmin edebilece?iniz gibi, Send/Recv fonksiyonlar?nda var olan otomatik olarak bekleme i?lemi burada kullan?c? inisiyatifine b?rak?lmaktad?r. Bu fonksiyonlar tek ba?lar?na kullan?lmazlar. Muhakkak MPI_WAIT veya MPI_TEST gibi yard?mc? fonksiyonlar? kullanmalar? gerekmektedir.

MPI_Wait(&request,&status) 

ISEND ve IRECV fonksiyonlar? verileri yollayana veya alana kadar beklemelerini sa?layan fonksiyondur. Status istenilen mesaj?n adresini ve tag’ ini dönmektedir.

MPI_Test (&request,&flag,&status)

Bu fonksiyonumuz da istenilen verinin ula??p ula?mad???n? kontrol etmek için kullan?l?r. E?er verimiz istenilen yere ula?m??sa flag olarak true de?eri  dönmektedir. Status istenilen mesaj?n adresini ve tag’ ini dönmektedir.

MPI_Reduce(data, result, count, type, op, root,comm) 

Bu fonksiyonumuz N tane makinede olu?mu? sonuçlar? derleyerek ana proses’ te result dizisinde saklamaktad?r. Geri kalan de?i?kenlerden count “reduce”(al?nm?? veri) say?s?n?, type al?nan verilerin türlerini, op yap?lan al?nma i?lemlerinin sonuçlar?n?, root verilerin al?nd??? prosesleri ve son olarak comm haberle?me ortam?n?n ad?n? (MPI_COMM_WORLD) almaktad?r.

Yukar?da da gördü?ümüz gibi 5 tane i?lemci ayr? data yani veriler üretmektedir. ?stersek bunlar? ayr? ayr? yollayabiliriz. Bunun için her makine send/recv fonksiyonlar?n? kullanabiliriz. Biz bunun yerine MPI_REDUCE fonksiyonunu kullan?yoruz. Elimizde ki bütün “data” verilerini MPI_REDUCE arac?l??? ile ana i?lemcide “result” dizisine gönderiyoruz. 

 

 

 

MPI_AllReduce(data, result, count, type, op, root,comm)

ALLREDUCE fonksiyonu REDUCE ile i?levsel olarak ayn?d?r. Tek fark? bütün proseslere result de?erini göndermektedir.

MPI_Barrier(comm) 

Global haberle?me fonksiyonlar?n?n en önemlilerindendir. Bütün proseslerin i?lemleri tamamlanana kadar devam etmelerini engelleyen senkronizasyon fonksiyonudur.

MPI_Bcast(&buffer,count,datatype,root,comm) 

BCAST, Broadcasting kelimesinin k?salt?lm?? halidir. Root olarak say?lan prosesten arabellekteki (buffer) de?erleri “comm” ortam?nda ki bütün proseslere yollamaktad?r. ?lk yaz?mda yazd???m gibi MPI paralel makineler aras? haberle?me kütüphanesidir ve 100 den fazla fonksiyonu vard?r.

MPI_Scatter (*sendbuf, sendcnt, sendtype, *recvbuf, recvcnt, recvtype, root, comm)

Tek bir kaynak task’tan gruptaki her bir task’a ayr? mesajlar?n da??t?lmas?n? sa?lar.

MPI_Gather (*sendbuf, sendcnt, sendtype, *recvbuf, recvcount, recvtype, root, comm)

Gruptaki her bir tasktan ayr? mesajlar? al?r ve tek hedefe toplar. Bu rutin MPI_Scatter’?n ters i?lemidir.

 

Önceden tan?ml? MPI indirgeme i?lemleri ?unlard?r:

MPI Reduction Operation

C data types

Fortran data types

MPI_MAX

maximum

integer, float

integer, real, complex

MPI_MIN

minimum

integer, float

integer, real, complex

MPI_SUM

sum

integer, float

integer, real, complex

MPI_PROD

product

integer, float

integer, real, complex

MPI_LAND

logical AND

integer

logical

MPI_BAND

bit-wise AND

integer, MPI_BYTE

integer, MPI_BYTE

MPI_LOR

logical OR

integer

logical

MPI_BOR

bit-wise OR

integer, MPI_BYTE

integer, MPI_BYTE

MPI_LXOR

logical XOR

integer

logical

MPI_BXOR

bit-wise XOR

integer, MPI_BYTE

integer, MPI_BYTE

MPI_MAXLOC

max value and location

float, double and long double

real, complex,double precision

MPI_MINLOC

min value and location

float, double and long double

real, complex, double precision

 

MPI Argümanlar?

Buffer: Yollanacak veya al?nacak veriyi referanslayan program adres uzay?d?r.

Data Count: Yollanacak olan belirli bir tipteki veri eleman? say?s?d?r.

Data Type: Ta??nabilirlik için MPI kendi veri tiplerini tan?mlam??t?r:

 

MPI-C data types

MPI_CHAR

signed char

MPI_SHORT

signed short int

MPI_INT

signed int

MPI_LONG

signed long int

MPI_UNSIGNED_CHAR

unsigned char

MPI_UNSIGNED_SHORT

unsigned short int

MPI_UNSIGNED

unsigned int

MPI_UNSIGNED_LONG

unsigned long int

MPI_FLOAT

float

MPI_DOUBLE

double

MPI_LONG_DOUBLE

long double

MPI_BYTE

8 binary digits

MPI_PACKED

data packed or unpacked with MPI_Pack()/ MPI_Unpack

 

Destination: Send rutinlerinde kullan?lan bir argüman olup, mesaj?n nereye ula?t?r?laca??n? belirtir. Al?c? process’in rank’? ile tan?mlan?r.

Source: Mesaj?n nereden geldi?ini belirtir. Bu argüman herhangi bir süreçten mesaj almak için MPI_ANY_SOURCE wild card’?na ayarlanabilir.

Tag: Mesaj? unique olarak tan?mlamak için programc? taraf?ndan geli?igüzel atanan, negatif olmayan bir say?d?r. Send ve receive i?lemleri mesaj tag’lar?nda e?le?melidir. Receive i?lemi için MPI_ANY_TAG wild card’? kullan?labilir. MPI standart 0-32767 aras?ndaki say?lar?n kullan?labilmesini garanti eder.

Communicator: Haberle?me içeri?ini veya kaynak ve hedef alanlar? geçerli bir grup süreci i?aret eder. Programc? aç?kça yeni bir communicator olu?turmad?kça önceden tan?mlanm?? MPI_COMM_WORLD kullan?l?r.

Status: Receive i?lemi için mesaj?n kayna??n? ve mesaj?n tag’?n? belirtir. C’de bu argüman önceden tan?ml? MPI_Status yap?s?na (MPI_SOURCE ve MPI_TAG elemanlar?n? içerir) bir pointer’d?r.

Yorumlar (0)
Sadece kayıtlı kullanıcılar yorum yazabilir!
 
amınıza koyayım amınıza koyayım amınıza koyayım amınıza koyayım amınıza koyayım amınıza koyayım