program ParMatrixMultiplication;
uses
SysUtils,
Classes,
Math,
DateUtils;
const
N = 1000; // Matrix size
ThreadCount = 8; // Number of threads
type
TMatrix = array [0..N - 1, 0..N - 1] of double;
TVector = array [0..N - 1] of double;
var
A, B, C: TMatrix;
StartTime, EndTime: TDateTime;
// Matrix initialization with random values
procedure InitializeMatrix(var M: TMatrix);
var
i, j: integer;
begin
for i := 0 to N - 1 do
for j := 0 to N - 1 do
M[i, j] := Random;
end;
// Thread for matrix multiplication
type
TMatrixMultiplier = class(TThread)
private
FStartRow, FEndRow: integer;
protected
procedure Execute; override;
public
constructor Create(StartRow, EndRow: integer);
end;
constructor TMatrixMultiplier.Create(StartRow, EndRow: integer);
begin
inherited Create(True);
FStartRow := StartRow;
FEndRow := EndRow;
FreeOnTerminate := False;
end;
procedure TMatrixMultiplier.Execute;
var
i, j, k: integer;
sum: double;
v: TVector;
begin
for j := 0 to N - 1 do
begin
// Optimization: copy column of matrix B to vector
for k := 0 to N - 1 do
v[k] := B[k, j];
// Multiplication for the row range
for i := FStartRow to FEndRow do
begin
sum := 0;
for k := 0 to N - 1 do
sum := sum + A[i, k] * v[k];
C[i, j] := sum;
end;
end;
end;
// Main program
var
Threads: array of TMatrixMultiplier;
i, Step: integer;
begin
Randomize;
InitializeMatrix(A);
InitializeMatrix(B);
SetLength(Threads, ThreadCount);
StartTime := Now;
// Create and start threads
Step := N div ThreadCount;
for i := 0 to ThreadCount - 1 do
begin
if i < ThreadCount - 1 then
Threads[i] := TMatrixMultiplier.Create(i * Step, (i + 1) * Step - 1)
else
Threads[i] := TMatrixMultiplier.Create(i * Step, N - 1);
Threads[i].Start;
end;
// Wait for all threads to finish
for i := 0 to ThreadCount - 1 do
begin
Threads[i].WaitFor;
Threads[i].Free;
end;
EndTime := Now;
Writeln('Execution Time: ', MilliSecondsBetween(EndTime, StartTime), ' ms');
Readln;
end.