Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Problem sa parallel procesing procedurom Tparallel.for

[es] :: Pascal / Delphi / Kylix :: Problem sa parallel procesing procedurom Tparallel.for

[ Pregleda: 2193 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Milan Milosevic

Član broj: 67
Poruke: 932
*.dynamic.isp.telekom.rs.



+31 Profil

icon Problem sa parallel procesing procedurom Tparallel.for25.04.2015. u 14:47 - pre 108 meseci
Pozdrav. Neznam da li imate iskustva sa parallel procesing u delphiju.
Parallel procesing je korišćenje svih jezgara CPU-a ukoliko ih ima naravno više od jednog.
Paralel procesing je u delphiju uveden preko system.threading unita i ukljucen je u delphiju od verzije XE7,
mada postoje i druge STParallel i mnogo poznatija OmniThreadLibrary.
STParallel paralel rešava moj problem, ali ima dve mane. memoryleak što i nije veliki prolem jer je gubitak mali, ali drugi nedostatak je što nemože da se koristi za 64bite aplikacije, te mi je praktično neupotrebljiva. OmniThreadLibrary boluje od istog problema kao i delphija.
U parallel procesingu postoji zamena za for petlju. TParallel.For .
Problem deluje trivijalno, ali na netu nisam uspeo da nađem rešenje. Pošto su mi ljudi da ovog foruma uvek pomogli rekoh da ponovo postavim pitanje
Naime, ukoliko probam da napravim prostu sumu real brojeva ne dobijam uvek tačan rezultat, jer pokretanjem parallel procedure kreiraju se paralelni trejdovi za svako jegro posebno, for petlja se deli na onoliko delova koliko ima jegara i svaka se izvršava za sebe, dok u glavnom trejdu instrukcija
Memo1.Lines.Add ('All done: ' + vali.ToString); se izvršava odmah ne čekajući da svi procesi unutar petlje budu gotovi. Iz ovog razloga rezultat nije uvek dobar. Moje pitanje je kako da ovo rešim. Za TParallel ne postoji WaitForAll kao kod Ttask klase.

Code:

uses system.threading;
..
Var
  vali:Single;
begin
  vali:=0;
      TParallel.For(1,1000,
      procedure( i:Integer)
       begin
         vali:= vali+i*0.1;
       end );
 Memo1.Lines.Add  ('All done: ' + vali.ToString);
end;


ovo bi bilo ekvivalentno kodu
Code:

Var
  i:Integer;
  vali:Single;
begin
   vali:=0;
   for I := 1 to 1000 do vali:= vali+i*0.1;
    Memo1.Lines.Add ('All done: ' + vali.ToString);
end;
 
Odgovor na temu

Milan Milosevic

Član broj: 67
Poruke: 932
*.dynamic.isp.telekom.rs.



+31 Profil

icon Re: Problem sa parallel procesing procedurom Tparallel.for25.04.2015. u 19:57 - pre 108 meseci
Nasao sam neko resenje na netu koje radi
Prikačeni fajlovi
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Problem sa parallel procesing procedurom Tparallel.for

[ Pregleda: 2193 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.