Bernhard  GrojerParallel Extensions - June 2008 CTP



In der Zwischenzeit tut sich bei der Leistung die eine einzige CPU bringt leider nur mehr sehr wenig. Allerdings bekommen wir immer Mehr CPU(Kerne) die unsere Aufgaben erledigen können.

Doch - Sie wissen das sicherlich schon - ist Mutlithreading in der eigenen Anwendung immer ein Aufwand und oftmals nicht so einfach umsetzbar.

Microsoft arbeitet allerdings seit einiger Zeit an den Prallel Extensions für das .net Framework 3.5. Im Moment haben wir die June 2008 CTP verfügbar.

Ich wollte die Sache daher gleich mal testen. Und zwar wollte ich alle Primzahlen in einen gewissen Zahlenbereich berechnen lassen (brute-force)

   1:          public List<int> GetPrimeNumbers(int lowerLimit, int upperLimit)
   2:          {
   3:              var lst = new List<int>();
   4:              for (int i = lowerLimit; i < upperLimit; i++)
   5:              {
   6:                  if (IsPrime(i))
   7:                      lst.Add(i);
   8:              }
   9:              return lst;
  10:          }
  11:   
  12:          public bool IsPrime(int n)
  13:          {
  14:              for (int i = 2; i < n; i++)
  15:              {
  16:                  if (n % i == 0)
  17:                      return false;
  18:              }
  19:              return true;
  20:          }

Die Funktion GetPrimeNumbers gibt daraufhin alle Primzahlen retour. Allerdings - welche Überraschung - wird die Sache nur auf einen Kern ausgeführt. WIr verschenken daher auf Dual Cores bereits 50% Leistung.

Also versuchen wir das Problem zu umschiffen und Fügen folgende Methode hinzu:

   1:          public List<int> GetPrimeNumbersParallel(int lowerLimit, int upperLimit)
   2:          {
   3:              var lst = new List<int>();
   4:              Parallel.For(lowerLimit, upperLimit, delegate(int i)
   5:                              {
   6:                                  if (IsPrime(i))
   7:                                      lst.Add(i); 
   8:                              }
   9:                          );
  10:   
  11:              return lst;
  12:          }

In Zeile 4 verwenden wir nun die Prallel.For Methode (System.Threading) der Parallel Extensions und somit haben wir einen Methode entwickelt die all unsere Kerne nutzt ohne uns zu (manuellen) Threading zu zwingen.

Nun zu unserem Aufruf:

   1:              Stopwatch sw;
   2:              var pn = new PrimeNumber();
   3:              var startNumber = 2;
   4:              var endNumber = 500000;
   5:   
   6:              sw = Stopwatch.StartNew();
   7:              var res1 = pn.GetPrimeNumbers(startNumber, endNumber);
   8:              Console.WriteLine("Done Seq: {0}", sw.ElapsedMilliseconds);
   9:   
  10:              sw = Stopwatch.StartNew();
  11:              var res2 = pn.GetPrimeNumbersParallel(startNumber, endNumber);
  12:              Console.WriteLine("Done Parallel: {0}", sw.ElapsedMilliseconds);

Wir müssen beim Aufruf selbst nichts mehr beachten.


PrimeNumberResult 

Das Ergebnis kann sich sehen lassen würde ich sagen.

Download des Samples gibts hier.



Kategorien: 18.07.2008 10:07:14


 


Neuen Kommentar einfügen:

  Titel:   
  Name:
  E-Mail:
  Kommentar:

 
 


Kommentare




© Copyright 2008 ppedv AG