Paralel Programlama Örneği

Paralel Programlama Örneği

Paralel Algoritma

1 den n e Kadar Olan Sayıların Toplamı

#include
#include
   #include
  
   #define max_rows 100000
   #define send_data_tag 2001
   #define return_data_tag 2002

   int array[max_rows];
   int array2[max_rows];
  
  void main(int argc, char **argv)
   {
       int sum, partial_sum;
      MPI_Status status;
      int my_id, root_process, ierr, i, num_rows, num_procs,
         an_id, num_rows_to_receive, avg_rows_per_process,
         sender, num_rows_received, start_row, end_row, num_rows_to_send;

      /* Now replicte this process to create parallel processes.
       * From this point on, every process executes a seperate copy
       * of this program */

      ierr = MPI_Init(&argc, &argv);
     
      root_process = 0;
     
      /* find out MY process ID, and how many processes were started. */
     
      ierr = MPI_Comm_rank(MPI_COMM_WORLD, &my_id);
      ierr = MPI_Comm_size(MPI_COMM_WORLD, &num_procs);

      if(my_id == root_process) {
        
         /* I must be the root process, so I will query the user
          * to determine how many numbers to sum. */

       printf("Lütfen toplami bulunacak sayiyi giriniz: \n");
         scanf("%i", &num_rows);
     
         if(num_rows > max_rows) {
            printf("Cok sayi var.\n");
            exit(1);
         }

         avg_rows_per_process = num_rows / num_procs;

         /* dizi hazirlaniyor */

         for(i = 0; i < num_rows; i++) {
            array[i] = i + 1;
         }

         /* distribute a portion of the bector to each child process */
  
         for(an_id = 1; an_id < num_procs; an_id++) {
            start_row = an_id*avg_rows_per_process + 1;
            end_row   = (an_id + 1)*avg_rows_per_process;

            if((num_rows - end_row) < avg_rows_per_process)
               end_row = num_rows - 1;

            num_rows_to_send = end_row - start_row + 1;

            ierr = MPI_Send( &num_rows_to_send, 1 , MPI_INT,
                  an_id, send_data_tag, MPI_COMM_WORLD);

            ierr = MPI_Send( &array[start_row], num_rows_to_send, MPI_INT,
                  an_id, send_data_tag, MPI_COMM_WORLD);
         }

         /* and calculate the sum of the values in the segment assigned
          * to the root process */
       
         sum = 0;
         for(i = 0; i < avg_rows_per_process + 1; i++) {
            sum += array[i];  
         }

         printf("ana islemci tarafindan hesaplanan toplam = %i \n", sum);

         /* and, finally, I collet the partial sums from the slave processes,
          * print them, and add them to the grand sum, and print it */

         for(an_id = 1; an_id < num_procs; an_id++) {
           
            ierr = MPI_Recv( &partial_sum, 1, MPI_LONG, MPI_ANY_SOURCE,
                  return_data_tag, MPI_COMM_WORLD, &status);
 
            sender = status.MPI_SOURCE;

            printf("%i. islemci tarafindan gönderilen parca toplam %i\n", sender, partial_sum);
    
            sum += partial_sum;
         }

         printf("Genel Toplam: %i\n", sum);
      }

      else {

         /* I must be a slave process, so I must receive my array segment,
          * storing it in a "local" array, array1. */

         ierr = MPI_Recv( &num_rows_to_receive, 1, MPI_INT,
               root_process, send_data_tag, MPI_COMM_WORLD, &status);
         
         ierr = MPI_Recv( &array2, num_rows_to_receive, MPI_INT,
               root_process, send_data_tag, MPI_COMM_WORLD, &status);

         num_rows_received = num_rows_to_receive;

         /* Calculate the sum of my portion of the array */

         partial_sum = 0;
         for(i = 0; i < num_rows_received; i++) {
            partial_sum += array2[i];
         }

         /* parça toplamları kök işlemciye gönderiyor */

         ierr = MPI_Send( &partial_sum, 1, MPI_LONG, root_process,
               return_data_tag, MPI_COMM_WORLD);
      }
      ierr = MPI_Finalize();
   }

Paralel Pogramlama Aşamaları

mpi programının kurulduktan sonraki aşamaları;
-visual studio programı açılır..
-yeni proje ekle den visual c++ kısmındaki win32 sekmesine gelinir ve win32 Console Application seçilir..
-gelen sayfada empty project seçilir..
-açılan projede, Source Files a sağ tıklanır Add->New Item seçilir..
-gelen sayfada C++File(.cpp) seçilip devam edilir..
-projemize sağ tıklayarak properties seçilir..
-Configuration -> All Configurations seçiliyken C/C++ -> General -> Additional Include Directories e mpich2 nin include klasörü eklenir
-Configuration -> All Configurations seçiliyken linker -> general -> Additional library Directories e mpich2 nin lib klasörü eklenir
-Configuration -> active(debug) seçiliyken c/c++ -> code generation -> runtime library -> multi-threaded debug yapılır
-Configuration -> debug seçiliyken, linker -> input -> additional dependencies -> cxxd.lib ve mpi.lib eklenir
-Configuration ->release seçiliyken, c/c++ -> code generation -> runtime library -> multi threaded yapılır
-Configuration ->active(release) seçiliyken, linker -> input -> additional dependencies -> cxx.lib ve mpi.lib eklenir
-projemize kod girilir ve çalıştırma seçeneği release seçilir..
-çalıştırıldıktan sonra oluşan exe uzantılı dosya mpich2 nin bin klasörüne kopyalanır..
-exe uzantılı dosyayı çalıştırmak için,başlat -> çalıştır -> cmd yazılır..
-gelen sayfada mpich2 nin bin klasörüne cd ve cd.. komutları kullanılarak erişilir..
-son komut ise; mpiexec -localonly -n işlemci_sayısı exe_uzantılı_dosyanın_ismi şeklindedir..


Yorumlar0

Henüz Yorum Yapılmamış.Yorumlarınızı bekliyoruz

Yorumlarınızı Bekliyoruz


Yorum Yazın

Yorum Yapın