From d52b356f1a380875ce12b4a4b8c8cb320c947c10 Mon Sep 17 00:00:00 2001 From: catharsian Date: Tue, 6 May 2025 19:28:57 +0300 Subject: [PATCH] Implemented map2 It works but it's messy --- MathNet.Numerics.sln | 19 +++++---- src/FSharp.Tests/DenseMatrixGPUTests.fs | 4 +- src/FSharp.Tests/FSharp.Tests.fsproj | 2 +- src/FSharp/FSharp.fsproj | 9 +++- src/FSharp/LinearAlgebra.Matrix.GPU.fs | 55 ++++++++++++++++++++++++- 5 files changed, 75 insertions(+), 14 deletions(-) diff --git a/MathNet.Numerics.sln b/MathNet.Numerics.sln index 3e4873687..1b12a99b4 100644 --- a/MathNet.Numerics.sln +++ b/MathNet.Numerics.sln @@ -28,27 +28,27 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{B54A0B40-DE22-49FB-B1C0-6E5BDA3B0B2F}" ProjectSection(SolutionItems) = preProject .editorconfig = .editorconfig + .gitattributes = .gitattributes + .gitignore = .gitignore appveyor.yml = appveyor.yml + build.cmd = build.cmd + build.sh = build.sh Directory.Build.props = Directory.Build.props global.json = global.json - build\MathNet.Numerics.nuspec = build\MathNet.Numerics.nuspec - build\MathNet.Numerics.FSharp.nuspec = build\MathNet.Numerics.FSharp.nuspec build\MathNet.Numerics.CUDA.Win.nuspec = build\MathNet.Numerics.CUDA.Win.nuspec + build\MathNet.Numerics.FSharp.nuspec = build\MathNet.Numerics.FSharp.nuspec build\MathNet.Numerics.MKL.Linux-x64.nuspec = build\MathNet.Numerics.MKL.Linux-x64.nuspec build\MathNet.Numerics.MKL.Linux-x86.nuspec = build\MathNet.Numerics.MKL.Linux-x86.nuspec build\MathNet.Numerics.MKL.Linux.nuspec = build\MathNet.Numerics.MKL.Linux.nuspec build\MathNet.Numerics.MKL.Win-x64.nuspec = build\MathNet.Numerics.MKL.Win-x64.nuspec build\MathNet.Numerics.MKL.Win-x86.nuspec = build\MathNet.Numerics.MKL.Win-x86.nuspec build\MathNet.Numerics.MKL.Win.nuspec = build\MathNet.Numerics.MKL.Win.nuspec + build\MathNet.Numerics.nuspec = build\MathNet.Numerics.nuspec build\MathNet.Numerics.OpenBLAS.Win.nuspec = build\MathNet.Numerics.OpenBLAS.Win.nuspec build\NativeProvider.targets = build\NativeProvider.targets + NuGet.config = NuGet.config paket.dependencies = paket.dependencies paket.lock = paket.lock - build.cmd = build.cmd - build.sh = build.sh - .gitignore = .gitignore - .gitattributes = .gitattributes - NuGet.config = NuGet.config restore.cmd = restore.cmd restore.sh = restore.sh EndProjectSection @@ -69,6 +69,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Data.Text", "src\Data.Text\ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Data.Tests", "src\Data.Tests\Data.Tests.csproj", "{1FBB8988-3F40-4FCE-BEA8-2C705888804A}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{8EC462FD-D22E-90A8-E5CE-7E832BA40C5D}" + ProjectSection(SolutionItems) = preProject + kernels.fs = kernels.fs + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU diff --git a/src/FSharp.Tests/DenseMatrixGPUTests.fs b/src/FSharp.Tests/DenseMatrixGPUTests.fs index 07d11474a..792cbe6af 100644 --- a/src/FSharp.Tests/DenseMatrixGPUTests.fs +++ b/src/FSharp.Tests/DenseMatrixGPUTests.fs @@ -25,8 +25,8 @@ module DenseMatrixGPUTests = [] let ``DenseMatrixGPU.map2`` () = - GPU.Matrix.map2 id largeM largeM |> shouldEqual largeM + GPU.Matrix.map2 <@(+)@> largeM largeM |> shouldEqual (Matrix.map (fun x -> x + x) largeM) [] let ``DenseMatrixGPU.mXm`` () = - GPU.Matrix.mXm largeM largeM |> shouldEqual largeM \ No newline at end of file + GPU.Matrix.mXm largeM largeM |> shouldEqual largeM diff --git a/src/FSharp.Tests/FSharp.Tests.fsproj b/src/FSharp.Tests/FSharp.Tests.fsproj index f53fde33b..df2d81eb7 100644 --- a/src/FSharp.Tests/FSharp.Tests.fsproj +++ b/src/FSharp.Tests/FSharp.Tests.fsproj @@ -3,7 +3,7 @@ Exe false - net8.0;net48 + net8.0; MathNet.Numerics.FSharp.Tests MathNet.Numerics.Tests false diff --git a/src/FSharp/FSharp.fsproj b/src/FSharp/FSharp.fsproj index 98a00dc49..4a2c8d9b4 100644 --- a/src/FSharp/FSharp.fsproj +++ b/src/FSharp/FSharp.fsproj @@ -2,7 +2,7 @@ Library - net8.0;net6.0;net48;netstandard2.0 + net8.0 MathNet.Numerics.FSharp MathNet.Numerics true @@ -17,11 +17,16 @@ many contributions, proper release notes with attributions will follow. thank yo fsharp F# math numeric statistics probability integration interpolation regression solve fit linear algebra matrix fft false false - 2003;NU1604 + 2003;NU1604;NU1608 + + + 2.0.6 + + diff --git a/src/FSharp/LinearAlgebra.Matrix.GPU.fs b/src/FSharp/LinearAlgebra.Matrix.GPU.fs index a286832ca..99840d1b1 100644 --- a/src/FSharp/LinearAlgebra.Matrix.GPU.fs +++ b/src/FSharp/LinearAlgebra.Matrix.GPU.fs @@ -32,7 +32,7 @@ namespace MathNet.Numerics.LinearAlgebra.GPU open System open MathNet.Numerics open MathNet.Numerics.LinearAlgebra - +open Brahma.FSharp /// A module which implements functional matrix operations. [] @@ -42,7 +42,58 @@ module Matrix = let iter f (v: #Matrix<_>) = v /// !!! - let map2 f (v: #Matrix<_>) (w: #Matrix<_>) = v + let map2 (f: Quotations.Expr<'a -> 'b -> 'c>) (v: #Matrix<'a>) (w: #Matrix<'b>) = + let device = ClDevice.GetFirstAppropriateDevice() // ? + let context = RuntimeContext(device).ClContext + + let n = v.RowCount + let m = v.ColumnCount + + let m1_gpu = context.CreateClArray<_>(v.ToColumnMajorArray(), HostAccessMode.NotAccessible) + let m2_gpu = context.CreateClArray<_>(w.ToColumnMajorArray(), HostAccessMode.NotAccessible) + let m3_gpu = + context.CreateClArray( + n * m, + HostAccessMode.NotAccessible, + deviceAccessMode=DeviceAccessMode.WriteOnly, + allocationMode = AllocationMode.Default + ) + + let localWorkSize = 4 + + let kernel = + <@ + fun (r: Range2D) (m1: ClArray<_>) (m2: ClArray<_>) (m3: ClArray<_>) -> + let i = r.GlobalID0 + let j = r.GlobalID1 + + m3.[i * m + j] <- (%f) m1[i * m + j] m2[i * m + j] + @> + + let kernel = context.Compile kernel + + let ndRange = + Range2D( + n, + m, + localWorkSize, + localWorkSize + ) + + let commandQueue = context.QueueProvider.CreateQueue() + let kernel = kernel.GetKernel() + + commandQueue.Post(Msg.MsgSetArguments(fun () -> kernel.KernelFunc ndRange m1_gpu m2_gpu m3_gpu)) + commandQueue.Post(Msg.CreateRunMsg<_, _> kernel) + let result : 'c[] = Array.zeroCreate(n * m) + let result = commandQueue.PostAndReply(fun ch -> Msg.CreateToHostMsg(m3_gpu, result, ch)) + commandQueue.Post(Msg.CreateFreeMsg m1_gpu) + + commandQueue.Post(Msg.CreateFreeMsg m2_gpu) + + commandQueue.Post(Msg.CreateFreeMsg m3_gpu) + + result |> DenseMatrix.raw n m /// !!! let mXm (v: #Matrix<_>) (w: #Matrix<_>) = v