Pi sayısının paralel bilgisayarlarla hesaplanması

Geliştirme ortamı ve kullanılan süreçler aşağıdaki gibidir;
    ° Bilgisayarlara Pardus 2009 işletim sisteminin kurulması
    ° Bilgisayarlarda tam yetkili (ssh protokollü) aynı kullanıcı adı ve şifreye sahip kullanıcı oluşturulması.
    ° Bilgisayarlara gcc (C derleyicisi) ve OpenMPI (Mesaj Tabanlı Paralel Programlama Modeli) paketlerinin kurulması.
    ° Pi sayısını hesaplayan kodun MPI kütüphanesi ile C programlama dili kullanılarak yazılması
    ° Programın derlenmesi
        $mpicc MPIdeneme.c – o ck
    ° Programın tek bilgisayarda çalıştırılması
        $mpirun –np 10 ck
    ° Programın birden fazla makinada birden fazla süreçle çalıştırılması
        $mpirun –H 192.168.1.5 –H 192.168.1.3 –np 10 ck

MPI Nedir?
    MPI başta dağıtık bellekli sistemler olmak üzere paralel algoritma yazmaya yarayan bir kütüphane standardıdır.Bir programlama dili değildir.MPI kütüphanelerinin C, C++ ve Fortran dili aileleri için sürümleri bulunmaktadır.MPI, “mesaj geçme” mantığına dayalıdır. Değişik işlemciler, birbirleriyle iletiler sayesinde haberleşirler.

MPI kütüphanesine ait bazı fonskiyonlar;

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_Get_processor_name(&name,&resultlength)
    İşlemcinin adını ve adın uzunluğunu dönmektedir.

MPI_Wtime( )
    Double deger olarak paralel kodun çalışmaya başlamasından sonra geçen zamanı vermektedir.

MPI_Send(buf, count, datatype, dest, tag, comm)
    Bir sürecin bir diğerine değişken göndermek istediği zaman bu fonksiyon kullanılır. Tek bir değişken gönderilebildiği gibi tamamen bir dizi veya bir dizinin bir kısmı da bir kerede gönderilebilir.

MPI_Recv(buf, count, datatype, source, tag, comm, status)
    Bir süreç, başka bir sürecin gönderdiği değişkeni veya değişkenleri bu fonksiyon yardımıyla alır.

MPI_Finalize( )
    Bütün işlemlerimizden sonra MPI_Finalize diyerek işlemlerimizi sonlandırıyoruz.

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.

Derleyen Emre Tekelioğlu
Kaynaklar;
http://www.mpi-forum.org/docs/mpi21-report.pdf
http://en.wikipedia.org/wiki/Message_Passing_Interface
http://www.grid.org.tr/etkinlikler/egitim/sunumlar/mpi_ornekleri.pdf http://ab.org.tr/ab03/tammetin/114.pdf
http://www.emresururi.com/mpich2/mpich2_rehberi_v1_2.pdf

Projenin orjinal PDF dökümanını ve kaynak kodlarını indirmek için Tıklayın !