akanse.SmartVectorDotNet
0.1.1
dotnet add package akanse.SmartVectorDotNet --version 0.1.1
NuGet\Install-Package akanse.SmartVectorDotNet -Version 0.1.1
<PackageReference Include="akanse.SmartVectorDotNet" Version="0.1.1" />
<PackageVersion Include="akanse.SmartVectorDotNet" Version="0.1.1" />
<PackageReference Include="akanse.SmartVectorDotNet" />
paket add akanse.SmartVectorDotNet --version 0.1.1
#r "nuget: akanse.SmartVectorDotNet, 0.1.1"
#:package akanse.SmartVectorDotNet@0.1.1
#addin nuget:?package=akanse.SmartVectorDotNet&version=0.1.1
#tool nuget:?package=akanse.SmartVectorDotNet&version=0.1.1
<div align="center"> <img height=100 src="./docs/resources/logo.png"> </div> <div align="center"> <h1 style="margin-bottom: 0pt;">SmartVectorDotNet</h1> <p>SmartVectorDotNet is a library to calculate the sequence by a unified signature with SIMD.</p> </div>
<img src="https://img.shields.io/badge/-GitHub-blue.svg?logo=github" />
<img src="https://img.shields.io/badge/-NuGet-019733.svg?logo=nuget" />
Concepts
This library has 3 layers:
ScalarOp
<br/> provides generalized and backward-compatibility-enhanced operators andMath
/MathF
functions.VectorOp
<br/> provides SIMD parallelized APIs which are corresponding with each method inScalarOp
andVector<T>
specific operations.Vectorization
<br/> provides span based sequential operation. Their APIs are declared as strategy pattern, you can select simple loop or SIMD vectorized operation.
Usage
Generalized System.Numerics.Vector<T>
calculations
internal class GeneralizeMathFunc : IExample
{
public void Run(TextWriter logger)
{
var x = new Vector<double>([0.0, 1.0, 2.0, 3.0]);
var sin_x_pi = VectorOp.Sin(VectorOp.Multiply(x, VectorOp.Const<double>.PI));
logger.WriteLine(sin_x_pi);
}
}
Simply vectirozation
internal class VoctorizeSimply : IExample
{
public void Run(TextWriter logger)
{
var x = Enumerable.Range(0, 256).Select(i => (double)i).ToArray();
var tmp = new double[x.Length];
var ans = new double[x.Length];
Vectorization.SIMD.Multiply<double>(x, Math.PI, tmp);
Vectorization.SIMD.Sin<double>(tmp, ans);
logger.WriteLine(string.Join(", ", ans));
}
}
Vectorization for any function
internal class CalculateVectorized : IExample
{
public void Run(TextWriter logger)
{
var x = Enumerable.Range(0, 256).Select(i => (float)i).ToArray();
var y = Enumerable.Range(0, 256).Select(i => (float)i).ToArray();
var z = Enumerable.Range(0, 256).Select(i => (float)i).ToArray();
var ans = new float[256];
Vectorization.SIMD.Calculate<float, Formula>(x, y, z, ans);
logger.WriteLine(string.Join(", ", ans));
}
}
file readonly struct Formula : IVectorFormula3<float>
{
public float Calculate(float x1, float x2, float x3) =>
x1 * x1 + x2 * x2 + x3 * x3;
public Vector<float> Calculate(Vector<float> x1, Vector<float> x2, Vector<float> x3) =>
x1 * x1 + x2 * x2 + x3 * x3;
}
Vectorization for any function with interceptor (EXPERIMENTAL)
Required to reference SmartVectorDotNet.Generators
internal class CalculateVectorizedInterceptor : IExample
{
public void Run(TextWriter logger)
{
int[] x = [.. Enumerable.Range(0, 1000).Select(i => (int)i)];
var y = new int[x.Length];
var z = new int[x.Length];
var vectorization = new InterceptVectorization(logger);
vectorization.Calculate(
static x => x * x,
x.AsSpan(),
y.AsSpan()
);
vectorization.Calculate(
static (x, y) => ScalarOp.Add(x, y),
x.AsSpan(),
y.AsSpan(),
z.AsSpan()
);
logger.WriteLine(string.Join(", ", z.Take(10)));
}
}
file class InterceptVectorization(TextWriter logger) : SimdVectorization
{
protected override void CalculateCore<T, TFormula>(TFormula formula, ReadOnlySpan<T> x1, Span<T> ans)
{
logger.WriteLine("Intercepterd by CalculateCore`2(formula, x1, ans)");
base.CalculateCore(formula, x1, ans);
}
protected override void CalculateCore<T, TFormula>(TFormula formula, ReadOnlySpan<T> x1, ReadOnlySpan<T> x2, Span<T> ans)
{
logger.WriteLine("Intercepterd by CalculateCore`2(formula, x1, x2, ans)");
base.CalculateCore(formula, x1, x2, ans);
}
}
Release notes
v0.1.0
- first releases
v0.1.1
- supports custom formula vectorization
- adds
ParallelVectorization
to parallelize vector operation
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- System.Collections.Immutable (>= 9.0.3)
- System.Memory (>= 4.6.0)
- System.Runtime.CompilerServices.Unsafe (>= 6.1.0)
-
.NETStandard 2.1
- System.Collections.Immutable (>= 9.0.3)
- System.Memory (>= 4.6.0)
- System.Runtime.CompilerServices.Unsafe (>= 6.1.0)
-
net8.0
- System.Collections.Immutable (>= 9.0.3)
- System.Memory (>= 4.6.0)
- System.Runtime.CompilerServices.Unsafe (>= 6.1.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.