Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions QuadTree.Benchmark/BFS.fs
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,25 @@ type Benchmark() =

let mutable matrix = Unchecked.defaultof<Matrix.SparseMatrix<double>>


[<Params("494_bus.mtx", "arc130.mtx")>]
member val MatrixName = "" with get, set

[<GlobalSetup>]
member this.LoadMatrix() =
matrix <- readMtx (System.IO.Path.Combine(DIR_WITH_MATRICES, this.MatrixName)) false
matrix <-
match readMtx (System.IO.Path.Combine(DIR_WITH_MATRICES, this.MatrixName)) false with
| Ok m -> m
| Error msg -> failwith $"Failed to load matrix {this.MatrixName}: {msg}"

[<Benchmark>]
member this.BFS() =
let startVertices =
let startVerticesResult =
Vector.CoordinateList((uint64 matrix.ncols) * 1UL<Vector.dataLength>, [ 0UL<Vector.index>, 1UL ])
|> Vector.fromCoordinateList

let startVertices =
match startVerticesResult with
| Ok v -> v
| Error msg -> failwith $"Failed to create start vertices: {msg}"

Graph.BFS.bfs_level matrix startVertices
99 changes: 99 additions & 0 deletions QuadTree.Benchmark/Kronecker.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
namespace QuadTree.Benchmarks.Kronecker

open BenchmarkDotNet.Attributes
open QuadTree.Benchmarks.Utils

[<Config(typeof<MyConfig>)>]
[<MemoryDiagnoser>]
type Benchmark() =

let mutable sparseSmall = Unchecked.defaultof<Matrix.SparseMatrix<double>>
let mutable denseSmall = Unchecked.defaultof<Matrix.SparseMatrix<double>>
let mutable sparseMedium = Unchecked.defaultof<Matrix.SparseMatrix<double>>
let mutable denseMedium = Unchecked.defaultof<Matrix.SparseMatrix<double>>
let mutable sparseLarge = Unchecked.defaultof<Matrix.SparseMatrix<double>>
let mutable denseLarge = Unchecked.defaultof<Matrix.SparseMatrix<double>>

let rngSeed = 42

member private this.CreateMatrix size (generateValue: System.Random -> uint64 -> uint64 -> Option<float>) =
let rng = System.Random(rngSeed)

let coords =
[ for i in 0UL .. size - 1UL do
for j in 0UL .. size - 1UL do
match generateValue rng i j with
| Some v -> (i * 1UL<Matrix.rowindex>, j * 1UL<Matrix.colindex>, v)
| None -> () ]

match
Matrix.fromCoordinateList (
Matrix.CoordinateList(size * 1UL<Matrix.nrows>, size * 1UL<Matrix.ncols>, coords)
)
with
| Ok m -> m
| Error msg -> failwith $"Failed to create matrix: {msg}"

member private this.CreateSparseMatrix size density =
let generateValue (rng: System.Random) _ _ =
if rng.NextDouble() < density then
Some(rng.NextDouble())
else
None

this.CreateMatrix size generateValue

member private this.CreateDenseMatrix size =
let generateValue _ _ _ = Some 1.0
this.CreateMatrix size generateValue

[<GlobalSetup>]
member this.Setup() =
let sizeSmall = 8UL
let sizeMedium = 16UL
let sizeLarge = 32UL

sparseSmall <- this.CreateSparseMatrix sizeSmall 0.10
denseSmall <- this.CreateDenseMatrix sizeSmall
sparseMedium <- this.CreateSparseMatrix sizeMedium 0.05
denseMedium <- this.CreateDenseMatrix sizeMedium
sparseLarge <- this.CreateSparseMatrix sizeLarge 0.01
denseLarge <- this.CreateDenseMatrix sizeLarge

member private this.Mult a b = Some(a * b)

[<Benchmark>]
member this.Kronecker_SparseSmall() =
match Matrix.kroneckerProduct sparseSmall sparseSmall this.Mult with
| Ok res -> res
| Error _ -> failwith "Kronecker failed"

[<Benchmark>]
member this.Kronecker_DenseSmall() =
match Matrix.kroneckerProduct denseSmall denseSmall this.Mult with
| Ok res -> res
| Error _ -> failwith "Kronecker failed"

[<Benchmark>]
member this.Kronecker_SparseMedium() =
match Matrix.kroneckerProduct sparseMedium sparseMedium this.Mult with
| Ok res -> res
| Error _ -> failwith "Kronecker failed"

[<Benchmark>]
member this.Kronecker_DenseMedium() =
match Matrix.kroneckerProduct denseMedium denseMedium this.Mult with
| Ok res -> res
| Error _ -> failwith "Kronecker failed"

[<Benchmark>]
member this.Kronecker_SparseLarge() =
match Matrix.kroneckerProduct sparseLarge sparseLarge this.Mult with
| Ok res -> res
| Error _ -> failwith "Kronecker failed"

[<Benchmark>]
member this.Kronecker_DenseLarge() =
match Matrix.kroneckerProduct denseLarge denseLarge this.Mult with
| Ok res -> res
| Error _ -> failwith "Kronecker failed"
7 changes: 6 additions & 1 deletion QuadTree.Benchmark/Main.fs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,12 @@ let main argv =
BenchmarkSwitcher
[| typeof<QuadTree.Benchmarks.BFS.Benchmark>
typeof<QuadTree.Benchmarks.SSSP.Benchmark>
typeof<QuadTree.Benchmarks.Triangles.Benchmark> |]
typeof<QuadTree.Benchmarks.Triangles.Benchmark>
typeof<QuadTree.Benchmarks.Reduce.Benchmark>
typeof<QuadTree.Benchmarks.ReduceComparison.Benchmark>
typeof<QuadTree.Benchmarks.VectorSlice.Benchmark>
typeof<QuadTree.Benchmarks.MatrixSlice.Benchmark>
typeof<QuadTree.Benchmarks.Kronecker.Benchmark> |]

benchmarks.Run argv |> ignore
0
88 changes: 88 additions & 0 deletions QuadTree.Benchmark/MatrixSlice.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
namespace QuadTree.Benchmarks.MatrixSlice

open BenchmarkDotNet.Attributes
open QuadTree.Benchmarks.Utils

[<Config(typeof<MyConfig>)>]
[<MemoryDiagnoser>]
type Benchmark() =

let mutable sparseSmall = Unchecked.defaultof<Matrix.SparseMatrix<double>>
let mutable denseSmall = Unchecked.defaultof<Matrix.SparseMatrix<double>>
let mutable sparseMedium = Unchecked.defaultof<Matrix.SparseMatrix<double>>
let mutable denseMedium = Unchecked.defaultof<Matrix.SparseMatrix<double>>
let mutable sparseLarge = Unchecked.defaultof<Matrix.SparseMatrix<double>>
let mutable denseLarge = Unchecked.defaultof<Matrix.SparseMatrix<double>>

let rngSeed = 42

member private this.CreateMatrix size (generateValue: System.Random -> uint64 -> uint64 -> Option<float>) =
let rng = System.Random(rngSeed)

let coords =
[ for i in 0UL .. size - 1UL do
for j in 0UL .. size - 1UL do
match generateValue rng i j with
| Some v -> (i * 1UL<Matrix.rowindex>, j * 1UL<Matrix.colindex>, v)
| None -> () ]

match
Matrix.fromCoordinateList (
Matrix.CoordinateList(size * 1UL<Matrix.nrows>, size * 1UL<Matrix.ncols>, coords)
)
with
| Ok m -> m
| Error msg -> failwith $"Failed to create matrix: {msg}"

member private this.CreateSparseMatrix size density =
let generateValue (rng: System.Random) _ _ =
if rng.NextDouble() < density then
Some(rng.NextDouble())
else
None

this.CreateMatrix size generateValue

member private this.CreateDenseMatrix size =
let generateValue _ _ _ = Some 1.0
this.CreateMatrix size generateValue

[<GlobalSetup>]
member this.Setup() =
let sizeSmall = 32UL
let sizeMedium = 256UL
let sizeLarge = 1024UL

sparseSmall <- this.CreateSparseMatrix sizeSmall 0.10
denseSmall <- this.CreateDenseMatrix sizeSmall
sparseMedium <- this.CreateSparseMatrix sizeMedium 0.05
denseMedium <- this.CreateDenseMatrix sizeMedium
sparseLarge <- this.CreateSparseMatrix sizeLarge 0.01
denseLarge <- this.CreateDenseMatrix sizeLarge

member private this.SliceMiddle(m: Matrix.SparseMatrix<double>) =
let n = int m.nrows
let start = n / 4
let last = 3 * n / 4 - 1

match Matrix.slice m start last start last with
| Ok res -> res
| Error _ -> failwith "Slice failed"

[<Benchmark>]
member this.MatrixSlice_SparseSmall() = this.SliceMiddle sparseSmall

[<Benchmark>]
member this.MatrixSlice_DenseSmall() = this.SliceMiddle denseSmall

[<Benchmark>]
member this.MatrixSlice_SparseMedium() = this.SliceMiddle sparseMedium

[<Benchmark>]
member this.MatrixSlice_DenseMedium() = this.SliceMiddle denseMedium

[<Benchmark>]
member this.MatrixSlice_SparseLarge() = this.SliceMiddle sparseLarge

[<Benchmark>]
member this.MatrixSlice_DenseLarge() = this.SliceMiddle denseLarge
5 changes: 5 additions & 0 deletions QuadTree.Benchmark/QuadTree.Benchmark.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@
<Compile Include="BFS.fs"/>
<Compile Include="SSSP.fs"/>
<Compile Include="Triangles.fs"/>
<Compile Include="Reduce.fs"/>
<Compile Include="ReduceComparison.fs"/>
<Compile Include="VectorSlice.fs"/>
<Compile Include="MatrixSlice.fs"/>
<Compile Include="Kronecker.fs"/>
<Compile Include="Main.fs"/>
</ItemGroup>

Expand Down
140 changes: 140 additions & 0 deletions QuadTree.Benchmark/Reduce.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
namespace QuadTree.Benchmarks.Reduce

open BenchmarkDotNet.Attributes
open QuadTree.Benchmarks.Utils

[<Config(typeof<MyConfig>)>]
[<MemoryDiagnoser>]
type Benchmark() =

let mutable sparseSmall = Unchecked.defaultof<Matrix.SparseMatrix<double>>
let mutable denseUniformSmall = Unchecked.defaultof<Matrix.SparseMatrix<double>>
let mutable denseRandomSmall = Unchecked.defaultof<Matrix.SparseMatrix<double>>

let mutable sparseMedium = Unchecked.defaultof<Matrix.SparseMatrix<double>>
let mutable denseUniformMedium = Unchecked.defaultof<Matrix.SparseMatrix<double>>
let mutable denseRandomMedium = Unchecked.defaultof<Matrix.SparseMatrix<double>>

let mutable sparseLarge = Unchecked.defaultof<Matrix.SparseMatrix<double>>
let mutable denseUniformLarge = Unchecked.defaultof<Matrix.SparseMatrix<double>>
let mutable denseRandomLarge = Unchecked.defaultof<Matrix.SparseMatrix<double>>

let add x y =
match x, y with
| Some a, Some b -> Some(a + b)
| Some a, None
| None, Some a -> Some a
| _ -> None

let rngSeed = 42

member private this.CreateMatrix size (generateValue: System.Random -> uint64 -> uint64 -> Option<float>) =
let rng = System.Random(rngSeed)

let coords =
[ for i in 0UL .. size - 1UL do
for j in 0UL .. size - 1UL do
match generateValue rng i j with
| Some v -> (i * 1UL<Matrix.rowindex>, j * 1UL<Matrix.colindex>, v)
| None -> () ]

match
Matrix.fromCoordinateList (
Matrix.CoordinateList(size * 1UL<Matrix.nrows>, size * 1UL<Matrix.ncols>, coords)
)
with
| Ok m -> m
| Error msg -> failwith $"Failed to create matrix: {msg}"

member private this.CreateSparseMatrix size density =
let generateValue (rng: System.Random) _ _ =
if rng.NextDouble() < density then
Some(rng.NextDouble())
else
None

this.CreateMatrix size generateValue

member private this.CreateDenseUniformMatrix size =
let generateValue _ _ _ = Some 1.0
this.CreateMatrix size generateValue

member private this.CreateDenseRandomMatrix size =
let generateValue (rng: System.Random) _ _ = Some(rng.NextDouble())
this.CreateMatrix size generateValue

[<GlobalSetup>]
member this.Setup() =
let sizeSmall = 32UL
let sizeMedium = 256UL
let sizeLarge = 1024UL

sparseSmall <- this.CreateSparseMatrix sizeSmall 0.10
denseUniformSmall <- this.CreateDenseUniformMatrix sizeSmall
denseRandomSmall <- this.CreateDenseRandomMatrix sizeSmall

sparseMedium <- this.CreateSparseMatrix sizeMedium 0.05
denseUniformMedium <- this.CreateDenseUniformMatrix sizeMedium
denseRandomMedium <- this.CreateDenseRandomMatrix sizeMedium

sparseLarge <- this.CreateSparseMatrix sizeLarge 0.01
denseUniformLarge <- this.CreateDenseUniformMatrix sizeLarge
denseRandomLarge <- this.CreateDenseRandomMatrix sizeLarge

[<Benchmark>]
member this.ReduceRows_SparseSmall() = Matrix.reduceRows add sparseSmall

[<Benchmark>]
member this.ReduceCols_SparseSmall() = Matrix.reduceCols add sparseSmall

[<Benchmark>]
member this.ReduceRows_SparseMedium() = Matrix.reduceRows add sparseMedium

[<Benchmark>]
member this.ReduceCols_SparseMedium() = Matrix.reduceCols add sparseMedium

[<Benchmark>]
member this.ReduceRows_SparseLarge() = Matrix.reduceRows add sparseLarge

[<Benchmark>]
member this.ReduceCols_SparseLarge() = Matrix.reduceCols add sparseLarge


[<Benchmark>]
member this.ReduceRows_DenseUniformSmall() = Matrix.reduceRows add denseUniformSmall

[<Benchmark>]
member this.ReduceCols_DenseUniformSmall() = Matrix.reduceCols add denseUniformSmall

[<Benchmark>]
member this.ReduceRows_DenseUniformMedium() =
Matrix.reduceRows add denseUniformMedium

[<Benchmark>]
member this.ReduceCols_DenseUniformMedium() =
Matrix.reduceCols add denseUniformMedium

[<Benchmark>]
member this.ReduceRows_DenseUniformLarge() = Matrix.reduceRows add denseUniformLarge

[<Benchmark>]
member this.ReduceCols_DenseUniformLarge() = Matrix.reduceCols add denseUniformLarge


[<Benchmark>]
member this.ReduceRows_DenseRandomSmall() = Matrix.reduceRows add denseRandomSmall

[<Benchmark>]
member this.ReduceCols_DenseRandomSmall() = Matrix.reduceCols add denseRandomSmall

[<Benchmark>]
member this.ReduceRows_DenseRandomMedium() = Matrix.reduceRows add denseRandomMedium

[<Benchmark>]
member this.ReduceCols_DenseRandomMedium() = Matrix.reduceCols add denseRandomMedium

[<Benchmark>]
member this.ReduceRows_DenseRandomLarge() = Matrix.reduceRows add denseRandomLarge

[<Benchmark>]
member this.ReduceCols_DenseRandomLarge() = Matrix.reduceCols add denseRandomLarge
Loading
Loading