Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module MatrixMult
- open System
- open System.Threading
- let calcEl(l, r , max, str1, stol1, long, m1:int[,], m2:int[,], resMatrix:int[,]) =
- if (r<max) then do
- let mutable res = 0
- for x=l to r do
- res <- 0
- let str = x / stol1
- let stol = x%stol1
- for i=0 to long-1 do
- res <- res + (m1.[str,i] * m2.[i, stol])
- resMatrix.[str,stol] <- res
- resMatrix
- let multiply (m1: int[,] , m2: int[,] , threadNumber:int) =
- let l11 = m1.GetLength 0
- let l12 = m1.GetLength 1
- let l21 = m2.GetLength 0
- let l22 = m2.GetLength 1
- let resLength = l11*l22
- let resMatrix = (Array2D.zeroCreate l11 l22)
- let step = resLength / threadNumber
- let threadArray = Array.init (threadNumber) (fun i -> new Thread(ThreadStart(fun _ ->
- calcEl (i*step , (i+1)*step, resLength, l11, l22, l12, m1, m2, resMatrix)
- )))
- calcEl ((threadNumber-1)*step, resLength-1, resLength, l11,l22,l12,m1,m2,resMatrix)
- for t in threadArray do
- t.Start()
- for t in threadArray do
- t.Join()
- resMatrix
- [<EntryPoint>]
- let main argv =
- 0
- //module MatrixMult
- //open Programs
- //open NUnit.Framework
- //[<TestCase ([|[|5;1|]; [|2;6|]|], [| [|7;-1|]; [|-1;5|] |], 2, Result = [| [|34;0|]; [|8;28|] |])>]
- //let ``Test`` (m1 : int[,], m2: int[,], threadNumber : int) =
- //multiply (m1, m2, threadNumber)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement