Beste mensen,
Ik heb een algoritme geschreven dat ik door een thread wil laten uitvoeren.
De te berekenen input data deel ik op in groepen gelijk aan het aantal processor cores. Daarna laat ik deze gegevens door een gelijk aantal instanties van deze thread bewerken.
We hebben alleen het probleem dat we hiermee geen 100% processor belasting halen, maar eerder ergens in de buurt van 30%.
Na wat onderzoek lijkt het probleem te komen door het lokaal declareren van dynamische arrays. Maar ook nadat van een stuk code al het dynamisch geheugen globaal is gemaakt blijkt dit niet de oplossing te zijn.
Op welke manier kan ik dit probleem oplossen? Waardoor wordt dit probleem veroorzaakt?
Ik wil zo min mogelijk aanpassingen doen aan de bestaande algoritme code. Zeker sommige recursieve stukken zijn lastig aan the passen (in het geval van dynamisch geheugen globaal maken).
Hieronder een stuk code voorbeeld code. Het wisselen tussen DoFill1 en DoFill2 in de execute illustreert het probleem.
Alvast bedankt,
Beijert
Code:
type
T2DArray = Array of Array of Double;
P2DArray = ^T2DArray;
TMultiThread = class(TThread)
private
da, db: Double;
arr: T2DArray;
procedure DoFill1(a: P2DArray);
procedure DoFill2(a: P2DArray);
protected
procedure Execute; override;
end;
...
procedure TMultiThread.DoFill1(a: P2DArray);
var
tmp: T2DArray;
i, j: Integer;
begin
SetLength(tmp, Length(a^), Length(a^[0]));
for i := 0 to Length(tmp) - 1 do
for j := 0 to Length(tmp[0]) - 1 do
tmp[i][j] := da * db;
CopyMemory(a, @tmp, SizeOf(tmp));
end;
procedure TMultiThread.DoFill2(a: P2DArray);
var
i, j: Integer;
begin
for i := 0 to Length(a^) - 1 do
for j := 0 to Length(a^[0]) - 1 do
a^[i][j] := da * db;
end;
procedure TMultiThread.Execute;
begin
SetLength(arr, 8, 8);
da := 1.123;
db := 3.345;
while not Terminated do
begin
// dit geeft een lage processor belasting
DoFill1(@arr);
// dit geeft een hoge processor belasting
//DoFill2(@arr);
end;
end;
...
procedure TForm1.Button1Click(Sender: TObject);
begin
TMultiThread.Create(false);
end;
Bookmarks