Files
Misaki.HighPerformance/Misaki.HighPerformance.Test/Benchmark/MathematicsBenchmark.cs

148 lines
3.1 KiB
C#

#define ADD_BENCHMARK
using BenchmarkDotNet.Attributes;
using Misaki.HighPerformance.Mathematics;
using System.Numerics;
using System.Runtime.Intrinsics;
namespace Misaki.HighPerformance.Test.Benchmark;
public class MathematicsBenchmark
{
#if ADD_BENCHMARK
private Vector4 _va = new Vector4(1, 2, 1, 2);
private Vector4 _vb = new Vector4(3, 4, 3, 4);
private float4 _fa = new float4(1, 2, 1, 2);
private float4 _fb = new float4(3, 4, 3, 4);
private Vector64<float> _va64 = Vector64.Create(1f, 2f);
private Vector64<float> _vb64 = Vector64.Create(3f, 4f);
[Benchmark]
public Vector4 VectorAdd()
{
for (var i = 0; i < 10; i++)
{
_va += _vb;
}
return _va;
}
//[Benchmark]
public float4 floatAdd()
{
for (var i = 0; i < 10; i++)
{
_fa += _fb;
}
return _fa;
}
[Benchmark]
public Vector64<float> Vector64Add()
{
for (var i = 0; i < 10; i++)
{
_va64 += _vb64;
}
return _va64;
}
#endif
#if FMA_BENCHMARK
private Vector4 _va = new Vector4(1, 2, 1, 2);
private Vector4 _vb = new Vector4(3, 4, 3, 4);
private Vector4 _vc = new Vector4(5, 6, 5, 6);
private Vector128<float> _va128 = Vector128.Create(1f, 2f, 1f, 2f);
private Vector128<float> _vb128 = Vector128.Create(3f, 4f, 3f, 4f);
private Vector128<float> _vc128 = Vector128.Create(5f, 6f, 5f, 6f);
private float4 _fa = new float4(1, 2, 1, 2);
private float4 _fb = new float4(3, 4, 3, 4);
private float4 _fc = new float4(5, 6, 5, 6);
[Benchmark]
public Vector4 Vector4()
{
for (var i = 0; i < 10; i++)
{
_va = _vb * _vc + _va;
}
return _va;
}
[Benchmark]
public Vector128<float> VectorFMA()
{
for (var i = 0; i < 10; i++)
{
_va128 = System.Runtime.Intrinsics.X86.Fma.MultiplyAdd(_vb128, _vc128, _va128);
}
return _va128;
}
[Benchmark]
public float4 floatFMA()
{
for (var i = 0; i < 10; i++)
{
_fa = _fb * _fc + _fa;
}
return _fa;
}
#endif
#if MATRIX_BENCHMARK
private float4x4 _a;
private float4x4 _b;
private Matrix4x4 _ma;
private Matrix4x4 _mb;
[GlobalSetup]
public void Init()
{
_a = new float4x4(
1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12,
13, 14, 15, 16);
_b = new float4x4(
16, 15, 14, 13,
12, 11, 10, 9,
8, 7, 6, 5,
4, 3, 2, 1);
_ma = new Matrix4x4(
1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12,
13, 14, 15, 16);
_mb = new Matrix4x4(
16, 15, 14, 13,
12, 11, 10, 9,
8, 7, 6, 5,
4, 3, 2, 1);
}
[Benchmark]
public float4x4 Float4x4Multiplication()
{
return math.mul(_a, _b);
}
[Benchmark]
public Matrix4x4 Matrix4x4Multiplication()
{
return Matrix4x4.Multiply(_ma, _mb);
}
#endif
}