fork download
  1. let MultiplyTyped (A : double[,]) (B : double[,]) =
  2. let rA, cA = (Array2D.length1 A) - 1, (Array2D.length2 A) - 1
  3. let cB = (Array2D.length2 B) - 1
  4. let C = Array2D.zeroCreate<double> (Array2D.length1 A) (Array2D.length2 B)
  5. for i = 0 to rA do
  6. for k = 0 to cA do
  7. for j = 0 to cB do
  8. C.[i,j] <- C.[i,j] + A.[i,k] * B.[k,j]
  9. C
  10.  
  11. let inline MultiplyGeneric (A : 'T[,]) (B : 'T[,]) =
  12. let rA, cA = Array2D.length1 A - 1, Array2D.length2 A - 1
  13. let cB = Array2D.length2 B - 1
  14. let C = Array2D.zeroCreate<'T> (Array2D.length1 A) (Array2D.length2 B)
  15. for i = 0 to rA do
  16. for k = 0 to cA do
  17. for j = 0 to cB do
  18. C.[i,j] <- C.[i,j] + A.[i,k] * B.[k,j]
  19. C
  20.  
  21. let test f =
  22. let sw = System.Diagnostics.Stopwatch.StartNew()
  23. f() |> ignore
  24. sw.Stop()
  25. printfn "%A" sw.Elapsed
  26.  
  27. let r = new System.Random()
  28. let A = Array2D.init 512 512 (fun i j -> r.NextDouble())
  29. let B = Array2D.init 512 512 (fun i j -> r.NextDouble())
  30.  
  31. //for i = 1 to 5 do
  32. test (fun () -> MultiplyTyped A B)
  33.  
  34. //for i = 1 to 5 do
  35. test (fun () -> MultiplyGeneric A B)
  36.  
Success #stdin #stdout 13.46s 25864KB
stdin
Standard input is empty
stdout
00:00:07.2426925
00:00:06.0864994