Skip to content

Commit 7f53f84

Browse files
committed
Changed element wise addition for matrices. It is not checked whether it is optimized
1 parent 882921b commit 7f53f84

8 files changed

Lines changed: 1942 additions & 73 deletions

File tree

GraphBLAS-sharp.sln

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "GraphBLAS-sharp.Benchmarks"
1717
EndProject
1818
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "docsTool", "docsTool\docsTool.fsproj", "{8855EC73-F6A1-43D3-AFBC-04A3E09F9BD9}"
1919
EndProject
20+
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "App", "src\App\App.fsproj", "{CC5B806C-70FD-4808-A2A1-21F4843A850D}"
21+
EndProject
2022
Global
2123
GlobalSection(SolutionConfigurationPlatforms) = preSolution
2224
Debug|Any CPU = Debug|Any CPU
@@ -78,10 +80,23 @@ Global
7880
{4C6EB3D0-B6BF-4FF5-BC77-CC7CB3F307E6}.Release|x64.Build.0 = Release|Any CPU
7981
{4C6EB3D0-B6BF-4FF5-BC77-CC7CB3F307E6}.Release|x86.ActiveCfg = Release|Any CPU
8082
{4C6EB3D0-B6BF-4FF5-BC77-CC7CB3F307E6}.Release|x86.Build.0 = Release|Any CPU
83+
{CC5B806C-70FD-4808-A2A1-21F4843A850D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
84+
{CC5B806C-70FD-4808-A2A1-21F4843A850D}.Debug|Any CPU.Build.0 = Debug|Any CPU
85+
{CC5B806C-70FD-4808-A2A1-21F4843A850D}.Debug|x64.ActiveCfg = Debug|Any CPU
86+
{CC5B806C-70FD-4808-A2A1-21F4843A850D}.Debug|x64.Build.0 = Debug|Any CPU
87+
{CC5B806C-70FD-4808-A2A1-21F4843A850D}.Debug|x86.ActiveCfg = Debug|Any CPU
88+
{CC5B806C-70FD-4808-A2A1-21F4843A850D}.Debug|x86.Build.0 = Debug|Any CPU
89+
{CC5B806C-70FD-4808-A2A1-21F4843A850D}.Release|Any CPU.ActiveCfg = Release|Any CPU
90+
{CC5B806C-70FD-4808-A2A1-21F4843A850D}.Release|Any CPU.Build.0 = Release|Any CPU
91+
{CC5B806C-70FD-4808-A2A1-21F4843A850D}.Release|x64.ActiveCfg = Release|Any CPU
92+
{CC5B806C-70FD-4808-A2A1-21F4843A850D}.Release|x64.Build.0 = Release|Any CPU
93+
{CC5B806C-70FD-4808-A2A1-21F4843A850D}.Release|x86.ActiveCfg = Release|Any CPU
94+
{CC5B806C-70FD-4808-A2A1-21F4843A850D}.Release|x86.Build.0 = Release|Any CPU
8195
EndGlobalSection
8296
GlobalSection(NestedProjects) = preSolution
8397
{5D30E174-2538-47AC-8443-318C8C5DC2C9} = {C397A34C-84F1-49E7-AEBC-2F9F2B196216}
8498
{1CA2E092-2320-451D-A4F0-9ED7C7C528CA} = {ACBEE43C-7A88-4FB1-9B06-DB064D22B29F}
8599
{4C6EB3D0-B6BF-4FF5-BC77-CC7CB3F307E6} = {DEF656DE-BCED-4C49-B5ED-950D4A29B78B}
100+
{CC5B806C-70FD-4808-A2A1-21F4843A850D} = {C397A34C-84F1-49E7-AEBC-2F9F2B196216}
86101
EndGlobalSection
87102
EndGlobal

src/App/App.fsproj

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<OutputType>Exe</OutputType>
5+
<TargetFramework>netcoreapp3.1</TargetFramework>
6+
</PropertyGroup>
7+
8+
<ItemGroup>
9+
<Compile Include="Program.fs" />
10+
</ItemGroup>
11+
12+
<ItemGroup>
13+
<ProjectReference Include="..\Graphblas-sharp\graphblas-sharp.fsproj" />
14+
</ItemGroup>
15+
16+
</Project>

src/App/Program.fs

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
open System
2+
3+
open Brahma.OpenCL
4+
open Brahma.FSharp.OpenCL.WorkflowBuilder.Basic
5+
6+
open GraphBLAS.FSharp
7+
open GraphBLAS.FSharp.Predefined
8+
9+
open GraphBLAS.FSharp
10+
open GraphBLAS.FSharp.Algorithms
11+
open System.IO
12+
open System
13+
open MatrixBackend
14+
open GraphBLAS.FSharp.Predefined
15+
open Brahma.FSharp.OpenCL.WorkflowBuilder.Basic
16+
open Brahma.FSharp.OpenCL.WorkflowBuilder.Evaluation
17+
18+
[<EntryPoint>]
19+
let main argv =
20+
21+
// let workGroupSize = 256
22+
// let workSize n =
23+
// let m = n - 1
24+
// m - m % workGroupSize + workGroupSize
25+
26+
// let arr = [|5;4;3;2;1|]
27+
// let arrLength = arr.Length
28+
// let arr2 = [|6;7;8;9;10|]
29+
// let command =
30+
// <@
31+
// fun (ndRange: _1D)
32+
// (input1: int[])
33+
// (input2: int[]) ->
34+
35+
// let i = ndRange.GlobalID0
36+
// if i < arrLength then
37+
// let (a, b) = (41, 42)
38+
// input1.[i] <- a
39+
// input2.[i] <- b
40+
// @>
41+
// let binder kernelP =
42+
// let ndRange = _1D(workSize arr.Length, workGroupSize)
43+
// kernelP
44+
// ndRange
45+
// arr
46+
// arr2
47+
// let wf =
48+
// opencl {
49+
// do! RunCommand command binder
50+
// let! _ = ToHost arr
51+
// let! _ = ToHost arr2
52+
// ()
53+
// }
54+
// oclContext.RunSync wf |> ignore
55+
// for i in 0 .. arr.Length - 1 do
56+
// printfn "%i, %i" arr.[i] arr2.[i]
57+
58+
let readMatrix (fileName: string) =
59+
use streamReader = new StreamReader(fileName)
60+
61+
while streamReader.Peek() = int '%' do
62+
streamReader.ReadLine() |> ignore
63+
64+
let matrixInfo =
65+
streamReader.ReadLine().Split(' ')
66+
|> Array.map int
67+
68+
let (nrows, ncols, nnz) =
69+
matrixInfo.[0], matrixInfo.[1], matrixInfo.[2]
70+
71+
[ 0 .. nnz - 1 ]
72+
|> List.map
73+
(fun _ ->
74+
streamReader.ReadLine().Split(' ')
75+
|> (fun line -> int line.[0], int line.[1], float line.[2]))
76+
|> List.toArray
77+
|> Array.sort
78+
|> Array.unzip3
79+
|> fun (rows, cols, values) ->
80+
let c f x y = f y x
81+
let rows = rows |> Array.map (c (-) 1)
82+
let cols = cols |> Array.map (c (-) 1)
83+
rows, cols, values, nrows, ncols
84+
85+
// for i in 0 .. rows.Length - 1 do
86+
// printfn "(%i, %i, %A)" rows.[i] cols.[i] values.[i]
87+
88+
// let leftMatrix =
89+
// COOMatrix<float>(100, 100,
90+
// [|0;1;2;3;3;3;5;5;5;7|], [|0;0;2;0;1;2;7;8;9;0|], [|1.1;9.4;16.0;0.1;0.1;0.1;0.1;0.1;0.1;0.1|])
91+
// let rightMatrix =
92+
// COOMatrix<float>(100, 100,
93+
// [|0;0;2;4;4;4;4|], [|0;1;2;0;1;2;3|], [|-1.1;5.72;-6.0;0.1;0.1;0.1;0.1|])
94+
95+
// let leftMatrix =
96+
// COOMatrix<float>(100, 100,
97+
// [|0;1;2|], [|0;0;2|], [|1.1;9.4;16.0|])
98+
// let rightMatrix =
99+
// COOMatrix<float>(100, 100,
100+
// [|0;0;2|], [|0;1;2|], [|-1.1;5.72;-6.0|])
101+
102+
let rows, cols, values, nrows, ncols = readMatrix "matrix.mtx"
103+
let leftMatrix = COOMatrix<float>(nrows, ncols, rows, cols, values)
104+
105+
let rows, cols, values, nrows, ncols = readMatrix "matrix2.mtx"
106+
let rightMatrix = COOMatrix<float>(nrows, ncols, rows, cols, values)
107+
108+
let workflow =
109+
opencl {
110+
let! resultMatrix = leftMatrix.EWiseAdd rightMatrix None FloatSemiring.addMult
111+
return! resultMatrix.ToHost()
112+
}
113+
114+
let resultMatrix : COOMatrix<float> = downcast oclContext.RunSync workflow
115+
116+
let rows = resultMatrix.Rows
117+
let columns = resultMatrix.Columns
118+
let values = resultMatrix.Values
119+
120+
// for i in 0 .. values.Length - 1 do
121+
// printfn "(%i, %i, %A)" rows.[i] columns.[i] values.[i]
122+
123+
for i in 0 .. values.Length / 2 - 1 do
124+
printfn "(%i, %i, %A)" rows.[i] columns.[i] values.[i]
125+
printfn "========================================"
126+
for i in values.Length / 2 .. values.Length - 1 do
127+
printfn "(%i, %i, %A)" rows.[i] columns.[i] values.[i]
128+
129+
0

0 commit comments

Comments
 (0)