open System open System.Threading open System.Diagnostics type Matrix = double[,] // Функция для умножения части матрицы let multiplyPart (A: Matrix) (B: Matrix) (C: Matrix) startRow endRow = let size = A.GetLength(0) for i in startRow .. endRow - 1 do for j in 0 .. size - 1 do for k in 0 .. size - 1 do C.[i, j] <- C.[i, j] + A.[i, k] * B.[k, j] // Последовательное умножение матриц let multiplySequential (A: Matrix) (B: Matrix) : Matrix = let size = A.GetLength(0) let C = Array2D.zeroCreate size size multiplyPart A B C 0 size C // Параллельное умножение матриц с синхронизацией let multiplyParallel (A: Matrix) (B: Matrix) numThreads : Matrix = let size = A.GetLength(0) let C = Array2D.zeroCreate size size let rowsPerThread = size / numThreads let threads = Array.zeroCreate numThreads for i in 0 .. numThreads - 1 do let startRow = i * rowsPerThread let endRow = if i = numThreads - 1 then size else startRow + rowsPerThread threads.[i] <- new Thread(fun () -> multiplyPart A B C startRow endRow) // Запускаем потоки threads |> Array.iter (fun t -> t.Start()) // Ожидаем завершения всех потоков threads |> Array.iter (fun t -> t.Join()) C // Функция для генерации матрицы let generateMatrix size = let matrix = Array2D.zeroCreate size size let rnd = Random() for i in 0 .. size - 1 do for j in 0 .. size - 1 do matrix.[i, j] <- double (rnd.Next(10)) matrix [] let main argv = let sizes = [ 100; 300; 500 ] let threadCounts = [ 1; 2; 4; 8; 16; 32; 64; 128; 256; 512] // Заголовки таблицы printfn "| Размер | Потоков | Алгоритм | Время (мс) |" for size in sizes do for numThreads in threadCounts do let A = generateMatrix size let B = generateMatrix size let stopwatch = Stopwatch.StartNew() let algorithm = if numThreads = 1 then multiplySequential A B |> ignore; "Последовательный" else multiplyParallel A B numThreads |> ignore; "Параллельный" stopwatch.Stop() // Вывод результатов в виде таблицы printfn "| %dx%d | %d | %s | %d |" size size numThreads algorithm stopwatch.ElapsedMilliseconds 0