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

Hata
  • XML Parsing Error at 1:82. Error 9: Invalid character
Anasayfa Programlama C++ Builder MPI ile Asal Say?lar?n Hesaplanmas?


MPI ile Asal Say?lar?n Hesaplanmas?

Bu program MPI dili ile  Asal Say?lar?n daha h?zl? bulunmas? uygulamas?d?r.Büyük asal de?erler ?ifreleme
konusunda oldukça önemli oldu?undan h?zl? bir ?ekilde bulunma i?lemleri sa?lanmal?d?r.
Asal say?lar bulunurken efektif  bir algoritma olan karekök algoritmas? kullan?lm??t?r. (Herhangi bir say? için 1 den say?n?n kareköküne kadar tam olarak bölünüp bölünmedi?inin kontrolü yeterli olacakt?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 Asal 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 bulunan asal say?lar? göstermek
amaçl? kullan?lm??t?r.

Kosulacak ?simli klasör ise program? ko?ma ?eklimizdir. Di?er iki klasördeki exeleri bulunduran bu klasör
tam payla??ma açarak Paralel_Bul.exe yi çal??t?r?n?z.Çal??t?rd?ktan sonra programda gerekli ayarlar? yap?n?z.

Örnek Ko?ma:

Server Bilgisayar?n A? Üzerindeki ?smini Giriniz: Paralel_Bul.exe yi ko?tu?unuz bilgisayar?n a? ismini giriniz

Tam Payla??ma Aç?lacak asal.exe'nin ve Paralel_Bul.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

Bilgisayar A? Üzerindeki ?simlerini Giriniz:
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.

Daha sonra Hesapla Butonuna T?klad???nda:

Bir s?n?r de?eri girilir.(Hangi say?ya kadar Asallar bulunacak)
Program?n her a?amas?nda kullan?c?y? uyaracak ve do?ru bilgi girmesini sa?layacak uyar? pencereleri yap?lm??t?r.


Bu de?erden sonra ise bilgisayarlara gönderilecek olan block uzunlu?u girilir. Daha sonra ise her bilgisayarda kaç adet process ko?aca?? belirlenir. Bu i?lemler yap?l?rken dikkat edilmesi gereken hususlar vard?r. Örne?in s?n?r de?eri block uzunlu?una tam olarak bölünmesi gerekir. E?er birden fazla bilgisayar girilmi?se bu durumda ise (bilgisayar say?s?*process*block) büyüklü?ünün  s?n?r de?erini geçmemesi gerekir. Bütün bu durumlar program içinde kontrol edilmi? olup kullan?c? yanl?? bilgi girse bile uyar?lar? sa?lanm?? ve do?ru bilgi girilmesi için kullan?c? sürekli uyar?lm??t?r.

Yapt???m denemelerde (2 bilgisayar üzerinde ) 10000000 ‘a kadar asallar? bul dedi?imde ( 50000 block uzunlu?u her bilgisayarda da 3 process ko?ulmak kayd?yla) süre olarak 10 sn ç?kt???n?, 1000000’a kadar asallar? tek bir bilgisayarda bul dedi?imde ise( 50000 block uzunlu?u 3 processs) süre olarak 14 sn ç?kt???n? gördüm.

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.  
  6. #include "Unit1.h"
  7. #include "stdio.h"
  8. //---------------------------------------------------------------------------
  9. #pragma package(smart_init)
  10. #pragma resource "*.dfm"
  11. TForm1 *Form1;
  12. //---------------------------------------------------------------------------
  13. __fastcall TForm1::TForm1(TComponent* Owner)
  14.         : TForm(Owner)
  15. {
  16. }
  17. //---------------------------------------------------------------------------
  18.  
  19. void __fastcall TForm1::Button1Click(TObject *Sender)
  20. {
  21. ListBox1->Items->Clear();
  22. ListBox2->Items->Clear();
  23. if(ListBox3->Items->Count>0)
  24. {
  25. if(FileExists("tamam.dat"))
  26. DeleteFile("tamam.dat");
  27. if(FileExists("sonuc.dat"))
  28.    DeleteFile("sonuc.dat");
  29.  int sinir=StrToInt(InputBox("S?n?r De?eri","Bulunacak Asal Say?lar ?çin S?n?r De?eri Giriniz",""));
  30.  int blok=StrToInt(InputBox("Parça Blo?u","Her ??lemciye Gönderilecek Blok Say?s?n? Veriniz",""));
  31.  int tut=sinir%blok;
  32.  while(tut!=0)
  33.  {
  34.   Application->MessageBoxA("S?n?r De?eri Blok Uzunlu?una Tam Bölünmelidir","UYARI",MB_ICONINFORMATION);
  35.   blok=StrToInt(InputBox("Parça Blo?u","Her ??lemciye Gönderilecek Blok Say?s?n? Veriniz",""));
  36.   tut=sinir%blok;
  37.  }
  38.  
  39.  int proces=StrToInt(InputBox("Process Say?s?","Her ??lemciye Gönderilecek Process Say?s?n? Veriniz",""));
  40.  int kontrol=proces*blok*ListBox3->Items->Count;
  41.  while(kontrol>sinir)
  42.  {
  43.   String oeh="Process*Blok*Bilgisayar Say?s?(";
  44.   oeh+=ListBox3->Items->Count;
  45.   oeh+=")S?n?r? A?amaz";
  46.   Application->MessageBoxA(oeh.c_str(),"UYARI",MB_ICONINFORMATION);
  47.   proces=StrToInt(InputBox("Process Say?s?","Her ??lemciye Gönderilecek Process Say?s?n? Veriniz",""));
  48.   kontrol=proces*blok*ListBox3->Items->Count;
  49.  }
  50.   String x="C:\\Program Files\\MPICH2\\bin\\mpiexec.exe -wdir \\\\";
  51.   x+=Edit2->Text;
  52.   x+="\\";
  53.   x+=Edit3->Text;
  54.   x+="\\";
  55.   x+=" -hosts ";
  56.    x+=ListBox3->Items->Count;
  57.  x+=" ";
  58.  for(int k=0;k<ListBox3->Items->Count;k++)
  59.  {
  60.  x+=ListBox3->Items->Strings[k];
  61.  x+=" ";
  62.  x+=proces;
  63.  x+=" ";
  64.  }
  65.  
  66.  x+=" \\\\";
  67.  x+=Edit2->Text;
  68.  x+="\\";
  69.  x+=Edit3->Text;
  70.  x+="\\";
  71.  x+="asal.exe ";
  72.  x+=sinir;
  73.  x+=" ";
  74.  x+=blok;
  75.  
  76.  TDateTime p=Time();
  77.  Label7->Caption=p;
  78.  WinExec(x.c_str(),NULL);
  79.  bool durum=true;
  80. while(durum)
  81. {
  82.  if(FileExists("tamam.dat"))
  83.  durum =false;
  84. }
  85.  TDateTime h=Time();
  86.  Label8->Caption=h;
  87.  Label9->Caption=h-p;
  88.  Application->MessageBoxA(x.c_str(),"MPI ?FADES?",MB_ICONINFORMATION);
  89. ListBox1->Items->LoadFromFile("sonuc.dat");
  90. AnsiString yazdir="Bulunan Asal Say? Adedi: ";
  91. yazdir+=IntToStr(ListBox1->Items->Count);
  92. Label3->Caption=yazdir;
  93. for(int i=0;i<ListBox1->Items->Count;i++)
  94. {
  95. String corsi=ListBox1->Items->Strings[i];
  96. String nokta=".";
  97.         int yakala=corsi.Pos(nokta);
  98.         if(yakala!=0)
  99.         {
  100.          corsi.Delete(yakala,(ListBox1->Items->Strings[i]).Length());
  101.         }
  102. ListBox2->Items->Add(corsi);
  103. DeleteFile("tamam.dat");
  104.    DeleteFile("sonuc.dat");
  105. }
  106. }
  107. else
  108. Application->MessageBoxA("En Az Bir Bilgisayar ?smi Girmelisiniz","UYARI",MB_ICONINFORMATION);
  109. }
  110. //---------------------------------------------------------------------------
  111.  
  112. void __fastcall TForm1::Button2Click(TObject *Sender)
  113. {
  114. if(Edit1->Text!="")
  115. {
  116.  ListBox3->Items->Add(Edit1->Text);
  117.  Edit1->Text="";
  118. }
  119. else
  120. Application->MessageBoxA("Lütfen Bilgisayar ?smi Giriniz","UYARI",MB_ICONINFORMATION);
  121. }
  122. //---------------------------------------------------------------------------
  123.  

Paralel Ko?an Program Kodu:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <stdbool.h>
#include <mpi.h>
#define YENI_IS 1 // Yeni i? göndermek içim
#define IS_BITTI 2 // ??in bitti?ini haber vermek için
 
 
bool Asalmi(double sayi)
{
  double kok=sqrt(sayi);
  double i;
  for(i=2.0;i<=kok;i=i+1.0)
  {
    //printf("kalan: %f, sayi: %f, i: %f, kok: %f\n",fmod(sayi,i),sayi,i,kok);
    if(fmod(sayi,i)==0.0)//(sayi%i)==0.0) yemedi
      return false;
  }
  return true;
}
 
int main(int argc,char *argv[])
{
       FILE *f;
       f=fopen("sonuc.dat","a+");
  int numprocs;
  int myid;
 
  MPI_Status stat;
  MPI_Init(&argc,&argv);
  MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
  MPI_Comm_rank(MPI_COMM_WORLD,&myid);
 
 
  if(argc!=3 && myid==0)
  {
    printf("Kullanim: %s <Ust Sinir> <Surec Basina Is>\n");
    MPI_Finalize();
    exit(0);
  }
 
  if(argc!=3)
  {
   MPI_Finalize();
   exit(0);
  }
  double UstSinir=50;
  int ProcessBasinaIs=5;
  UstSinir=atof(argv[1]);
  ProcessBasinaIs=atoi(argv[2]);
 
  int i,j;
  double *DonenAsallar;
  int DonenAsalSayisi;
  double aralik[2];
  DonenAsallar=malloc(sizeof(double)*ProcessBasinaIs);
 
 
 
  if(myid == 0)
  {
    //Master i?lemci kodu
    for(i=1;i<numprocs;i++)
    {
      aralik[0]=(i-1)*ProcessBasinaIs;
      aralik[1]=(i)*ProcessBasinaIs;
      MPI_Send(aralik,2,MPI_DOUBLE,i,YENI_IS,MPI_COMM_WORLD);
    }
    for(i=numprocs;i<=UstSinir/ProcessBasinaIs;i++)
    {
      MPI_Recv(&DonenAsalSayisi,1,MPI_INT,MPI_ANY_SOURCE,1,MPI_COMM_WORLD,&stat);
      MPI_Recv(DonenAsallar,DonenAsalSayisi,MPI_DOUBLE,stat.MPI_SOURCE,1,MPI_COMM_WORLD,&stat);
      for(j=0;j<DonenAsalSayisi;j++)
      {
   
      
       fprintf(f,"%f",DonenAsallar[j]);
       fputs("\n",f);                     
       printf("%f\n",DonenAsallar[j]);
      }
      aralik[0]=(i-1)*ProcessBasinaIs;
      aralik[1]=(i)*ProcessBasinaIs;
      MPI_Send(aralik,2,MPI_DOUBLE,stat.MPI_SOURCE,YENI_IS,MPI_COMM_WORLD);
    }
    for(i=1;i<numprocs;i++)
    {
      MPI_Recv(&DonenAsalSayisi,1,MPI_INT,MPI_ANY_SOURCE,1,MPI_COMM_WORLD,&stat);
      MPI_Recv(DonenAsallar,DonenAsalSayisi,MPI_DOUBLE,stat.MPI_SOURCE,1,MPI_COMM_WORLD,&stat);
      for(j=0;j<DonenAsalSayisi;j++)
          {
       fprintf(f,"%f",DonenAsallar[j]);
       fputs("\n",f);                         
       printf("%f\n",DonenAsallar[j]);
      }
      MPI_Send(aralik,2,MPI_DOUBLE,i,IS_BITTI,MPI_COMM_WORLD);
    }  
 
  }
  else
  {
      //Slave i?lemci kodu
      bool isVar=true; //i? var
      double sayac;
      while(isVar)
      {
        MPI_Recv(aralik,2,MPI_DOUBLE,0,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
       
        if(stat.MPI_TAG!=IS_BITTI)
        {
          DonenAsalSayisi=0;
          if(aralik[0]<2)
            aralik[0]=2;
          for(sayac=aralik[0];sayac<aralik[1];sayac+=1.0)
          if(Asalmi(sayac))
          {
            DonenAsallar[DonenAsalSayisi++]=sayac;
          }
          //for(j=0;j<DonenAsalSayisi;j++)
          //  printf("%f , ",DonenAsallar[j]);         
          //printf("DAS:%d\n",DonenAsalSayisi);
          MPI_Send(&DonenAsalSayisi,1,MPI_INT,0,1,MPI_COMM_WORLD);
          MPI_Send(DonenAsallar,DonenAsalSayisi,MPI_DOUBLE,0,1,MPI_COMM_WORLD);
           
        }
        else
          isVar=false;
      }
     
  }
 
  fflush(stdout);
  MPI_Finalize();
    fclose(f);
   FILE *p;
   p=fopen("tamam.dat","a+");
   fclose(p);
 
    return 0;
}
 

Yorumlar (2)
  • Umran  - OpenMP
    Merhaba,anlat?m?n?z için tesekkurler.??ime yarad? gerçekten.OpenMP ile asalsay?lar?n hesab? örne?ini de varsa payla?man?z? rica ediyorum...Tesekkurler...
  • Tunahan Alt?ntop  - Mpi, OpenMpi
    öncelikle merhaba mpi konusunda k?s?tl? kaynak olmas?ndan ve gerçekten ilgilenilerek yap?lan bu örnekten dolay? te?ekkürler. openmpi ve mpi ile ilgili çe?itli dökümanlar mevcut ama genel olarak ço?u kopyalan?p yap??t?r?lan dökümanlar benim sorum ise ?u ayn? i?lemleri openmpi ile linux üzerinde yapmak istersek hangi araçlar? hangi a?amalarda kullanmam?z gerekiyor? ilgilenirseniz sevinirim.
Sadece kayıtlı kullanıcılar yorum yazabilir!
Son Güncelleme ( Perşembe, 07 Nisan 2011 23:21 )  
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