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

Anasayfa Programlama C++ Builder MPI ile Mandelbrot Setinin Çizimi


MPI ile Mandelbrot Setinin Çizimi

AÇIKLAMA
Bu program MPI dili ile Mandelbrot setinin çizim uygulamasıdır.
Program içinde 3 adet klasor bulunmaktadır.

MPI 'in nasıl tüm bilgisayarlara nasıl kurulacağı ve gerekli ayarlar aşağıdaki linkte anlatılmıştır.

 

Linki Görebilmeniz İçin Üye Olmanız Gerekmektedir...

Üye Kayıt



Paralel MPI Kodları isimli klasör MPI kodunun koştuğu ve Dev-Cpp platformunda oluşturulmuştur koddur.
MPI kutuphanesinin C++ Builder'da eklenmesi problem oluşturduğundan dolayı Dev-Cpp seçilmiştir.

Görsellik İçin Koşulacak Program ve Kodları isimli klasör Mandelbrotun setinin çizimini göstermek
amaçlı kullanılmıştır.Ayrıca çizim yapıldıktan zoom yapma işlemi de bulunmaktadır.Çizilen resimde
bir dikdörtgen seçmeye çalışınız seçimi yaparken bir dikdörtgenin çizimi gösterilmeyecek fakat zoom yapılan bolge yeniden çizilecektir. Ve iç içe yapılan bütün seçimlerde mandelbrot setinin aynı olduğu görülecektir.
Bir kaç zoomdan sonra resimde bozulma olacaktır nedeni ise kullanılan sayısal sistemin bilgisayarla sınırlı
kalmasıdır.Hiç bozulmayacak şekilde bir çizim yapılması kendi tanımlayacağınız bir sayı sistemi ile mümkün
olabilir.

Kosulacak İsimli klasör ise programı koşma şeklimizdir. Diğer iki klasördeki exeleri bulunduran bu klasör
tam paylaşıma açarak Mandel ciz.exe yi çalıştırınız.Çalıştırdıktan sonra programda gerekli ayarları yapınız.
Örnek Koşma:

Bilgisayar İsimleri: Ağda  MPI kurulu olan bilgisayar isimleri hangilerinde koşmak istenirse
bu bilgisayarların ağ isimlerini yazmaya dikkat ediniz.Server bilgisayarda da koşulması istenirse onunda ismi eklenmelidir.

PROCESS SAYISI: Tüm bilgisayarlar da koşacak toplam process sayısını giriniz.Program otomatik olarak process
sayısını koşulacak toplam bilgisayar sayısına bölerek(ana bilgisayar dahil) her birine uygun process sayısı
gönderecektir.Koşulan processleri Görev Yöneticisindeki işlemler sekmesinde görebilirsiniz. Bütün bilgisayarlarda koşan processleri bu şekilde görebilirsiniz.

Server Bilgisayarın Ağ Üzerindeki İsmini Giriniz: Mandel Ciz.exe yi koştuğunuz bilgisayarın ağ ismini giriniz

Tam Paylaşıma Açılacak MandelMpi.exe'nin ve Mandel Ciz.exe'nin Bulunduğu Klasörün Ağ Paylaşım Adını Giriniz:
Buda bizden indirdiğiniz dosya olan "Kosulacak" tır. Eğer paylaşım adını değiştirirseniz onu yazmanız gerekir.

Programın Tamamını Aşağıdaki Linkten İndirebilirsiniz

Linki Görebilmeniz İçin Üye Olmanız Gerekmektedir...

Üye Kayıt

 Programın Görsellik İçin Koşulan Kodu:

  1. //---------------------------------------------------------------------------
  2.  
  3. #include <vcl.h>
  4. #pragma hdrstop
  5. #include <stdio.h>
  6. #include "Unit1.h"
  7. //---------------------------------------------------------------------------
  8. #pragma package(smart_init)
  9. #pragma resource "*.dfm"
  10. TForm1 *Form1;
  11. double x1=-2.0,y1=-2.0,x2=2.0,y2=2.0;
  12. int cx1,cx2,cy1,cy2;
  13. //---------------------------------------------------------------------------
  14. __fastcall TForm1::TForm1(TComponent* Owner)
  15.         : TForm(Owner)
  16. {
  17. }
  18. //---------------------------------------------------------------------------
  19. AnsiString Donustur(AnsiString a)
  20. {
  21. int pos;
  22. AnsiString r=a;
  23. if((pos=a.Pos(","))>0)
  24.   r=a.SubString(1,pos-1)+"."+a.SubString(pos+1,(a.Length()-pos-4
  25.   ));
  26. return r;
  27. }
  28.  
  29. void __fastcall TForm1::Button1Click(TObject *Sender)
  30. {
  31.  
  32.  int i,j;
  33.  int tut=StrToInt(Edit1->Text)/ListBox1->Items->Count;
  34.  String x="C:\\Program Files\\MPICH2\\bin\\mpiexec.exe -wdir \\\\";
  35.  x+=Edit3->Text;
  36.  x+="\\";
  37.  x+=Edit4->Text;
  38.  x+="\\ -hosts ";
  39.  x+=ListBox1->Items->Count;
  40.  x+=" ";
  41.  for(int k=0;k<ListBox1->Items->Count;k++)
  42.  {
  43.  x+=ListBox1->Items->Strings[k];
  44.  x+=" ";
  45.  x+=tut;
  46.  x+=" ";
  47.  }
  48.  
  49.  x+=" \\\\";
  50.  x+=Edit3->Text;
  51.  x+="\\";
  52.  x+=Edit4->Text;
  53.  x+="\\MandelMpi.exe "+Donustur(FloatToStr(x1))+" "+Donustur(FloatToStr(y1))+" "+Donustur(FloatToStr(x2))+" "+Donustur(FloatToStr(y2));
  54.  WinExec(x.c_str(),NULL);
  55. while((!FileExists("tamam.dat"))&&(!FileExists("sonuc.dat")));
  56.  
  57. FILE *ptr;  unsigned char ch;
  58. String yeap="\\\\";
  59. yeap+=Edit3->Text;
  60. yeap+="\\";
  61. yeap+=Edit4->Text;
  62. yeap+="\\";
  63. yeap+="sonuc.dat";
  64. ptr=fopen(yeap.c_str(),"rb");
  65. Graphics::TBitmap * Resim=new Graphics::TBitmap();
  66. Resim->Width=800;
  67. Resim->Height=600;
  68. for(i=0;i<600;i++)
  69.  for(j=0;j<800;j++)
  70.    {
  71.    fread(&ch,1,1,ptr);
  72.  
  73.     Resim->Canvas->Pixels[j][i]=TColor(RGB(ch,ch,ch));
  74.    }
  75.    fclose(ptr);
  76.    Image1->Picture->Bitmap=Resim;
  77.    DeleteFile("tamam.dat");
  78.    DeleteFile("sonuc.dat");
  79. }
  80. //---------------------------------------------------------------------------
  81.  
  82. void __fastcall TForm1::Image1MouseDown(TObject *Sender,
  83.       TMouseButton Button, TShiftState Shift, int X, int Y)
  84. {
  85. cx1=X;
  86. cy1=Y;
  87. }
  88. //---------------------------------------------------------------------------
  89. void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button,
  90.       TShiftState Shift, int X, int Y)
  91. {
  92. cx2=X;
  93. cy2=Y;
  94. double tx1=x1+(double)(cx1)/(double)Image1->Width*(x2-x1);
  95. double tx2=x1+(double)(cx2)/(double)Image1->Width*(x2-x1);
  96. double ty1=y1+(double)(cy1)/(double)Image1->Height*(y2-y1);
  97. double ty2=y1+(double)(cy2)/(double)Image1->Height*(y2-y1);
  98. x1=tx1;
  99. x2=tx2;
  100. y1=ty1;
  101. y2=ty2;
  102. Button1Click(this);
  103. }
  104. //---------------------------------------------------------------------------
  105. void __fastcall TForm1::Button2Click(TObject *Sender)
  106. {
  107. x1=-2.0;
  108. x2=2.0;
  109. y1=-2.0;
  110. y2=2.0;
  111. ListBox1->Items->Clear();
  112. Edit1->Text="";
  113. Edit2->Text="";
  114. }
  115. //---------------------------------------------------------------------------
  116. void __fastcall TForm1::Button3Click(TObject *Sender)
  117. {
  118. ListBox1->Items->Add(Edit2->Text);
  119. Edit2->Text="";
  120. }
  121. //---------------------------------------------------------------------------
  122.  

Paralel Koşan Program Kodu:

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <mpi.h>
int MandelHesapla(double x,double y)
{
    int count=0,max=255;
    double temp;
    double zx=0;
    double zy=0;
    double length=0;
    while(length<4.0 && count<max)
    {
      temp=zx*zx-zy*zy+x;
      zy=2*zx*zy+y;
      zx=temp;
      length=zx*zx+zy*zy;
      count++;
    }
    return count;       
}
double xmin,ymin,xmax,ymax;
unsigned char mandel[480000];
int main(int argc, char *argv[])
{
   
  if(argc!=1 && argc!=5)
  {
    printf("Kullanimi : %s <xmin> <ymin> <xmax> <ymax>",argv[0]);
    exit(1);
  }
  if(argc==1)
  {
    xmin=-2.0;
    ymin=-2.0;
    xmax=2.0;
    ymax=2.0;
  }
  else
  {
    xmin=atof(argv[1]);
    ymin=atof(argv[2]);
    xmax=atof(argv[3]);
    ymax=atof(argv[4]);
  }
 
  int numaram,boyut,i,satirno;
  MPI_Status status;
  MPI_Init(&argc,&argv);
  MPI_Comm_size(MPI_COMM_WORLD,&boyut);
  MPI_Comm_rank(MPI_COMM_WORLD,&numaram);
 
  if(numaram==0)
  {
    for(i=0;i<boyut-1;i++)
      MPI_Send(&i,1,MPI_INT,i+1,1,MPI_COMM_WORLD);
    for(i=boyut-1;i<600;i++)
    {
      int procno;
      MPI_Recv(&satirno,1,MPI_INT,MPI_ANY_SOURCE,1,MPI_COMM_WORLD,&status);
   
 
      MPI_Recv(mandel+satirno*800,800,MPI_CHAR,status.MPI_SOURCE,1,MPI_COMM_WORLD,&status);
   
     
      MPI_Send(&i,1,MPI_INT,status.MPI_SOURCE,1,MPI_COMM_WORLD);
  
 
    }
 
    for(i=0;i<boyut-1;i++)
    {
      MPI_Recv(&satirno,1,MPI_INT,MPI_ANY_SOURCE,1,MPI_COMM_WORLD,&status);
      MPI_Recv(&mandel[satirno*800],800,MPI_CHAR,status.MPI_SOURCE,1,MPI_COMM_WORLD,&status);
      MPI_Send(&i,1,MPI_INT,status.MPI_SOURCE,2,MPI_COMM_WORLD);
    }
 
    FILE * fp,*tr;
    fp=fopen("sonuc.dat","wb");
    fwrite(mandel,480000,1,fp);
    fclose(fp);
    tr=fopen("tamam.dat","wb");
    fclose(tr);
   
  }
  else
  {
      bool tamam=false;
      unsigned char hesap[800];
      int numara;
      while(!tamam)
      {
        MPI_Recv(&numara,1,MPI_INT,0,MPI_ANY_TAG,MPI_COMM_WORLD,&status);//Satır numarasını al
        if(status.MPI_TAG!=2)
        {
        double xartis=(xmax-xmin)/800.0;
        double y=ymin+(double)numara*(ymax-ymin)/600.0;
        double x;
        for(x=xmin,i=0;i<800;i++,x+=xartis)
        {
          hesap[i]=MandelHesapla(x,y);
        }
     
        MPI_Send(&numara,1,MPI_INT,0,1,MPI_COMM_WORLD);
  
        MPI_Send(hesap,800,MPI_CHAR,0,1,MPI_COMM_WORLD);
  
        }
        else
        {tamam=true;}
      }
  }
MPI_Finalize();
printf("Bitti\n");
}
 

Yorumlar (0)
Sadece kayıtlı kullanıcılar yorum yazabilir!
Son Güncelleme ( Perşembe, 07 Nisan 2011 23:24 )