Skip to content

Commit d7ff2d2

Browse files
committed
Improve eWiseAdd benchmarks
1 parent 800c00a commit d7ff2d2

8 files changed

Lines changed: 232 additions & 185 deletions

File tree

benchmarks/GraphBLAS-sharp.Benchmarks/BFSBenchmarks.fs renamed to benchmarks/GraphBLAS-sharp.Benchmarks/BenchmarksBFS.fs

File renamed without changes.
Lines changed: 221 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,221 @@
1+
namespace GraphBLAS.FSharp.Benchmarks
2+
3+
open GraphBLAS.FSharp
4+
open GraphBLAS.FSharp.Algorithms
5+
open BenchmarkDotNet.Attributes
6+
open BenchmarkDotNet.Configs
7+
open BenchmarkDotNet.Columns
8+
open BenchmarkDotNet.Engines
9+
open System.IO
10+
open System
11+
open MatrixBackend
12+
open GraphBLAS.FSharp.Predefined
13+
open MathNet.Numerics
14+
open Brahma.FSharp.OpenCL.WorkflowBuilder.Basic
15+
open Brahma.FSharp.OpenCL.WorkflowBuilder.Evaluation
16+
open Brahma.FSharp.OpenCL.Extensions
17+
open OpenCL.Net
18+
19+
type InputMatrixFormat = {
20+
MatrixName: string
21+
MatrixStructure: COOFormat<float>
22+
}
23+
with
24+
override this.ToString() =
25+
sprintf "%s (%i, %i)"
26+
this.MatrixName
27+
this.MatrixStructure.RowCount
28+
this.MatrixStructure.ColumnCount
29+
30+
[<MinColumn; MaxColumn>]
31+
[<Config(typeof<Config>)>]
32+
[<SimpleJob(RunStrategy.Throughput)>]
33+
type EWiseAddBenchmarks() =
34+
let mutable leftCOO = Unchecked.defaultof<Matrix<float>>
35+
let mutable rightCOO = Unchecked.defaultof<Matrix<float>>
36+
37+
let mutable leftCSR = Unchecked.defaultof<Matrix<float>>
38+
let mutable rightCSR = Unchecked.defaultof<Matrix<float>>
39+
40+
let mutable leftMathNetSparse =
41+
Unchecked.defaultof<LinearAlgebra.Matrix<float>>
42+
43+
let mutable rightMathNetSparse =
44+
Unchecked.defaultof<LinearAlgebra.Matrix<float>>
45+
46+
let mutable firstMatrix = Unchecked.defaultof<COOFormat<float>>
47+
let mutable secondMatrix = Unchecked.defaultof<COOFormat<float>>
48+
49+
[<ParamsSource("InputMatricesProvider")>]
50+
member val InputMatrix = Unchecked.defaultof<InputMatrixFormat> with get, set
51+
52+
[<GlobalSetup>]
53+
member this.FormInputData() =
54+
let transposeCOO (matrix: COOFormat<float>) =
55+
(matrix.Rows, matrix.Columns, matrix.Values)
56+
|||> Array.zip3
57+
|> Array.sortBy (fun (row, col, value) -> row)
58+
|> Array.unzip3
59+
|>
60+
fun (rows, cols, values) ->
61+
{
62+
Rows = cols
63+
Columns = rows
64+
Values = values
65+
RowCount = matrix.ColumnCount
66+
ColumnCount = matrix.RowCount
67+
}
68+
69+
firstMatrix <- this.InputMatrix.MatrixStructure
70+
secondMatrix <- transposeCOO this.InputMatrix.MatrixStructure
71+
72+
[<IterationSetup(Target="EWiseAdditionCOO")>]
73+
member this.BuildCOO() =
74+
leftCOO <-
75+
Matrix.Build<float>(
76+
firstMatrix.RowCount,
77+
firstMatrix.ColumnCount,
78+
firstMatrix.Rows,
79+
firstMatrix.Columns,
80+
firstMatrix.Values,
81+
COO
82+
)
83+
84+
rightCOO <-
85+
Matrix.Build<float>(
86+
secondMatrix.RowCount,
87+
secondMatrix.ColumnCount,
88+
secondMatrix.Rows,
89+
secondMatrix.Columns,
90+
secondMatrix.Values,
91+
COO
92+
)
93+
94+
[<IterationSetup(Target="EWiseAdditionCSR")>]
95+
member this.BuildCSR() =
96+
leftCSR <-
97+
Matrix.Build<float>(
98+
firstMatrix.RowCount,
99+
firstMatrix.ColumnCount,
100+
firstMatrix.Rows,
101+
firstMatrix.Columns,
102+
firstMatrix.Values,
103+
CSR
104+
)
105+
106+
rightCSR <-
107+
Matrix.Build<float>(
108+
secondMatrix.RowCount,
109+
secondMatrix.ColumnCount,
110+
secondMatrix.Rows,
111+
secondMatrix.Columns,
112+
secondMatrix.Values,
113+
CSR
114+
)
115+
116+
[<IterationSetup(Target="EWiseAdditionMathNetSparse")>]
117+
member this.BuildMathNetSparse() =
118+
leftMathNetSparse <-
119+
LinearAlgebra.SparseMatrix.ofListi
120+
firstMatrix.RowCount
121+
firstMatrix.ColumnCount
122+
(List.ofArray <| Array.zip3 firstMatrix.Rows firstMatrix.Columns firstMatrix.Values)
123+
124+
rightMathNetSparse <-
125+
LinearAlgebra.SparseMatrix.ofListi
126+
secondMatrix.RowCount
127+
secondMatrix.ColumnCount
128+
(List.ofArray <| Array.zip3 secondMatrix.Rows secondMatrix.Columns secondMatrix.Values)
129+
130+
[<Benchmark>]
131+
[<ArgumentsSource("AvaliableContextsProvider")>]
132+
member this.EWiseAdditionCOO(context: OpenCLEvaluationContext) =
133+
leftCOO.EWiseAdd rightCOO None FloatSemiring.addMult
134+
|> context.RunSync
135+
136+
[<Benchmark>]
137+
[<ArgumentsSource("AvaliableContextsProvider")>]
138+
member this.EWiseAdditionCSR(context: OpenCLEvaluationContext) =
139+
leftCSR.EWiseAdd rightCOO None FloatSemiring.addMult
140+
|> context.RunSync
141+
142+
[<Benchmark(Baseline=true)>]
143+
member this.EWiseAdditionMathNetSparse() = leftMathNetSparse + rightMathNetSparse
144+
145+
/// Sequence of paths to files where data for benchmarking will be taken from
146+
static member InputMatricesProvider =
147+
let matricesFilenames =
148+
seq {
149+
"arc130.mtx"
150+
}
151+
152+
let getFullPathToMatrix filename =
153+
Path.Join [| __SOURCE_DIRECTORY__
154+
"Datasets"
155+
"EWiseAddDatasets"
156+
filename |]
157+
158+
let getCOO (pathToGraph: string) =
159+
use streamReader = new StreamReader(pathToGraph)
160+
161+
while streamReader.Peek() = int '%' do
162+
streamReader.ReadLine() |> ignore
163+
164+
let matrixInfo =
165+
streamReader.ReadLine().Split(' ')
166+
|> Array.map int
167+
168+
let (nrows, ncols, nnz) =
169+
matrixInfo.[0], matrixInfo.[1], matrixInfo.[2]
170+
171+
[ 0 .. nnz - 1 ]
172+
|> List.map
173+
(fun _ ->
174+
streamReader.ReadLine().Split(' ')
175+
|> (fun line -> int line.[0], int line.[1], float line.[2]))
176+
|> List.toArray
177+
|> Array.sortBy (fun (row, _, _) -> row)
178+
|> Array.unzip3
179+
|>
180+
fun (rows, cols, values) ->
181+
let c f x y = f y x
182+
let rows = rows |> Array.map (c (-) 1)
183+
let cols = cols |> Array.map (c (-) 1)
184+
{
185+
Rows = rows
186+
Columns = cols
187+
Values = values
188+
RowCount = nrows
189+
ColumnCount = ncols
190+
}
191+
192+
matricesFilenames
193+
|> Seq.map
194+
(fun matrixFilename ->
195+
let fullPath = getFullPathToMatrix matrixFilename
196+
let matrixName = Path.GetFileNameWithoutExtension matrixFilename
197+
let matrixStructure = getCOO fullPath
198+
{
199+
MatrixName = matrixName
200+
MatrixStructure = matrixStructure
201+
}
202+
)
203+
204+
static member AvaliableContextsProvider =
205+
let mutable e = ErrorCode.Unknown
206+
Cl.GetPlatformIDs &e
207+
|> Array.collect (fun platform -> Cl.GetDeviceIDs(platform, DeviceType.All, &e))
208+
|> Seq.ofArray
209+
|> Seq.map
210+
(fun device ->
211+
let platform = Cl.GetDeviceInfo(device, DeviceInfo.Platform, &e).CastTo<Platform>()
212+
let platformName = Cl.GetPlatformInfo(platform, PlatformInfo.Name, &e).ToString()
213+
let deviceType = Cl.GetDeviceInfo(device, DeviceInfo.Type, &e).CastTo<DeviceType>()
214+
OpenCLEvaluationContext(platformName, deviceType)
215+
)
216+
217+
// не уверен, что на каждой итерации трансфер данных снова происходит
218+
// тк ссылка на массивы присваивается одна и та же
219+
// надо бы каждый раз в iterationSetup делать глубокую копию исходных массивов
220+
221+
// нужен ToString для OpenCLEvaliationContext -- печатал бы DeviceInfo.Name

benchmarks/GraphBLAS-sharp.Benchmarks/Config.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,5 +46,5 @@ type Config() =
4646
inherit ManualConfig()
4747

4848
do
49-
base.AddColumn [| TEPSColumn() :> IColumn |] |> ignore
49+
// base.AddColumn [| TEPSColumn() :> IColumn |] |> ignore
5050
base.AddFilter [| NameFilter(fun name -> name.Contains "MathNet" || name.Contains "COO") :> IFilter |] |> ignore

0 commit comments

Comments
 (0)