DAS_2024_1/minhasapov_ruslan_lab_5/MatrixMultiplication/Program.fs
2024-11-18 02:27:55 +04:00

77 lines
2.6 KiB
Forth
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
[<EntryPoint>]
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