Avatar billede ruma1974 Nybegynder
16. juni 2007 - 16:39 Der er 15 kommentarer og
1 løsning

tråde på multiprocessor computer

Hej,

Nu har jeg fornylig fået en ny laptop med 2 CPU'er og jeg har derfor omskrevet en nogle procedure så at de kan køre som tråde for at udnytte begge processor på samme tid.

Jeg started med at lave nogle små eksempler og det virkede fint. Begge processor blev brugt fuldt ud.

Mit problem er nu at når jeg laver tråde som begge tilgår et stort data  set (de læser kun) som er i hovedprogammet så køre programmet super langsomt og bruger ikke CPU'erne fuldt ud.

Kan dette problem løses uden at lave en kopi af data for hver eneste tråd?

Mvh,

Rune
Avatar billede martinlind Nybegynder
16. juni 2007 - 20:07 #1
Bruger du Syncronize når du læser ? hvis du gør er det sikkert derfor, hvis du bruger den, så venter du på din "hovedtråd" ( dit hovedprogram ) hvergang du tilgår data. For at løse det skal du selv styre din sync. delphi løsning mod vcl'en ( igen dit hovedprogram ) er ikke særlig efektiv, vcl'en er nemli' ikke født thread-safe og er aldrig blevet det :)
Avatar billede ruma1974 Nybegynder
16. juni 2007 - 20:33 #2
Jeg started med at bruge Syncronize men kun til at send resultaterne tilbage til vcl'en nu bruger jeg:

EnterCriticalSection(CritSect);
...
..
leaveCriticalSection(CritSect);

Under selve kørslen af tråden lader jeg tråden direkte få adgang til et dynamisk array. Dynamisk arrays skulle værre thread-safe.

Trådene tilgår forskellige dele af det dynamisk array.

Jeg arbejdere i øjeblikket på en ny tråd der får alt data tilsendt for at se om jeg kan få det til at virke selvom det ikke er en smart løsning.
Avatar billede ruma1974 Nybegynder
17. juni 2007 - 09:13 #3
Øv, med den nye version går det godt nok hurtigere med 2 tråde end med en men de to cpu'er bruges ifølge task manager ikke fuldt ud. Trådene har fået højste prioritet.
Avatar billede martinlind Nybegynder
17. juni 2007 - 11:54 #4
Hmmm.... Kan du se om den ene tråd står og venter på den anden ?
Avatar billede ruma1974 Nybegynder
17. juni 2007 - 13:03 #5
Er der nogen gode metoder til at checke om dette er tilfældet?

I øblikket bruger jeg task manager til at vudere hvor effektivt trådene arbejder.

Jeg har lige testet på et stort data set. Kun 30% bliver brugt på de to tråde begge cpu'er dog involveret.

Det er nok tilfældet at de vendter på hinanden men jeg forstår ikke hvorfor da jeg nu har kopieret alle metoder og alt data til hver tråd.

Det er kun til sidst når de sender reultatet tilbage at de arbejder på samme array.
Avatar billede martinlind Nybegynder
17. juni 2007 - 13:24 #6
Det er ikke sikker du kan få det til at køre bedre, man skal nok også ha en compiler der er lavet til at compilere til flere cpu'er osv. der er en del man skal tage højde for :), men sjovt at lege med og forske i.

Måske du kan lave en slags log, som du skriver i når en af trådene venter.
Avatar billede ruma1974 Nybegynder
17. juni 2007 - 13:25 #7
hmmm, når jeg køre en tråd får jeg følgende:

cpu1: 10%
cpu2: 50%

så en tråd køre åbenbart ikke 100% uafhængigt af vcl'en. Jeg bliver nok nød til at gå igennem koden igen.
Avatar billede martinlind Nybegynder
17. juni 2007 - 13:37 #8
Prøv evt. at kigge lidt på den måde delphi håndterer tråde, nu ved jeg ikke om du bruger beginthread() eller du bare har lavet Tthread klasse, men som jeg skrev tidligere er delphi måde at håndtere dem på ikke helt hensigtmæssig :)
Avatar billede ruma1974 Nybegynder
17. juni 2007 - 14:24 #9
Ok - jeg prøver at checke delphi hjælp.

Selve tråden er lavt med delphi template som er en thread klasse

Jeg starter mine tråde med følgende:

NewThreadSearch := ThreadSearch.Create(True);
NewThreadSearch.FreeOnTerminate := True;
setthreadpriority(GetCurrentThread,THREAD_PRIORITY_HIGHEST);
        try
        Inc(FThreadRefCount);
        NewThreadSearch.OnTerminate := form1.HandleTerminate;
        NewThreadSearch.Resume;
        except on EConvertError do
            begin
            NewThreadSearch.Free;
            end;
Avatar billede ruma1974 Nybegynder
17. juni 2007 - 17:09 #10
Puff, Det ser ud til at jeg bliver nød til at oprette alle public variabler i min thread klasse som threadvar.
Avatar billede martinlind Nybegynder
18. juni 2007 - 11:39 #11
:)
Avatar billede ruma1974 Nybegynder
18. juni 2007 - 14:29 #12
Nu har jeg oprettet alle globale variabler som threadvar da dette skulle sikre at der en kopi af data'erne for hver tråd men når jeg nu debugger min tråd så er min Tstringlist nil og alle mine integer værdier har værdien 0. Dette er selvom jeg har lavt en procedure der sætter alle avriabler inden tråden bliver kørt ("setvariables").

NewThreadSearch := ThreadSearch.Create(True);
NewThreadSearch.FreeOnTerminate := True;
NewThreadSearch.setvariables;
setthreadpriority(GetCurrentThread,THREAD_PRIORITY_HIGHEST);
        try
        Inc(FThreadRefCount);
        NewThreadSearch.OnTerminate := form1.HandleTerminate;
        NewThreadSearch.Resume;
        except on EConvertError do
            begin
            NewThreadSearch.Free;
            end;
Avatar billede ruma1974 Nybegynder
18. juni 2007 - 15:06 #13
Nu har jeg prøvet at sætte værdierne i min constructor til tråden men lige lidt hjælper det.

Værdierne går tabt i tråden.

Ah jeg kan se at kompilerne ignorere de linier hvor jeg prøver at tilføje værdier fra vcl'en til min variabler som er threadvar.

Men hvordan får jeg så overført de globale værdier fra vcl'en til threadvar variablerne?
Avatar billede ruma1974 Nybegynder
19. juni 2007 - 08:54 #14
Jeg opgiver og lave små dos programmer istedet - det er nemmere og det ser ud til at virke mere stabilt.

Martin hvis du laver et svar får du points for ulejligheden og den moralske opbakning :)
Avatar billede martinlind Nybegynder
19. juni 2007 - 13:10 #15
Godt forsøg, tråde er noget langhåret noget :)
Avatar billede ruma1974 Nybegynder
19. juni 2007 - 14:38 #16
Det var ikke helt spildt indsats en tråd køre fint - om ikke andent så har jeg lært noget nyt :)

Det eneste problem er når jeg starter flere tråde så køre de ikke optimalt.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester