Browse Source

Use envonment aware benchmarking for intrinsics.

js/color-alpha-handling
James Jackson-South 5 years ago
parent
commit
ec36095092
  1. 16
      tests/ImageSharp.Benchmarks/Codecs/Jpeg/BlockOperations/Block8x8F_Transpose.cs
  2. 81
      tests/ImageSharp.Benchmarks/Config.HwIntrinsics.cs
  3. 2
      tests/ImageSharp.Benchmarks/Config.cs
  4. 54
      tests/ImageSharp.Tests/TestUtilities/TestEnvironment.Features.cs

16
tests/ImageSharp.Benchmarks/Codecs/Jpeg/BlockOperations/Block8x8F_Transpose.cs

@ -6,26 +6,18 @@ using SixLabors.ImageSharp.Formats.Jpeg.Components;
namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg.BlockOperations namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg.BlockOperations
{ {
[Config(typeof(Config.HwIntrinsics_SSE_AVX))]
public class Block8x8F_Transpose public class Block8x8F_Transpose
{ {
private static readonly Block8x8F Source = Create8x8FloatData(); private static readonly Block8x8F Source = Create8x8FloatData();
[Benchmark(Baseline=true)] [Benchmark(Baseline = true)]
public void TransposeIntoVector4() public void TransposeInto()
{ {
var dest = default(Block8x8F); var dest = default(Block8x8F);
Source.TransposeIntoFallback(ref dest); Source.TransposeInto(ref dest);
} }
#if SUPPORTS_RUNTIME_INTRINSICS
[Benchmark]
public void TransposeIntoAvx()
{
var dest = default(Block8x8F);
Source.TransposeIntoAvx(ref dest);
}
#endif
private static Block8x8F Create8x8FloatData() private static Block8x8F Create8x8FloatData()
{ {
var result = new float[64]; var result = new float[64];

81
tests/ImageSharp.Benchmarks/Config.HwIntrinsics.cs

@ -0,0 +1,81 @@
// Copyright (c) Six Labors.
// Licensed under the Apache License, Version 2.0.
#if SUPPORTS_RUNTIME_INTRINSICS
using System.Runtime.Intrinsics.X86;
#endif
using BenchmarkDotNet.Environments;
using BenchmarkDotNet.Jobs;
namespace SixLabors.ImageSharp.Benchmarks
{
public partial class Config
{
private const string On = "1";
private const string Off = "0";
// See https://github.com/SixLabors/ImageSharp/pull/1229#discussion_r440477861
// * EnableHWIntrinsic
// * EnableSSE
// * EnableSSE2
// * EnableAES
// * EnablePCLMULQDQ
// * EnableSSE3
// * EnableSSSE3
// * EnableSSE41
// * EnableSSE42
// * EnablePOPCNT
// * EnableAVX
// * EnableFMA
// * EnableAVX2
// * EnableBMI1
// * EnableBMI2
// * EnableLZCNT
//
// `FeatureSIMD` ends up impacting all SIMD support(including `System.Numerics`) but not things
// like `LZCNT`, `BMI1`, or `BMI2`
// `EnableSSE3_4` is a legacy switch that exists for compat and is basically the same as `EnableSSE3`
private const string EnableAES = "COMPlus_EnableAES";
private const string EnableAVX = "COMPlus_EnableAVX";
private const string EnableAVX2 = "COMPlus_EnableAVX2";
private const string EnableBMI1 = "COMPlus_EnableBMI1";
private const string EnableBMI2 = "COMPlus_EnableBMI2";
private const string EnableFMA = "COMPlus_EnableFMA";
private const string EnableHWIntrinsic = "COMPlus_EnableHWIntrinsic";
private const string EnableLZCNT = "COMPlus_EnableLZCNT";
private const string EnablePCLMULQDQ = "COMPlus_EnablePCLMULQDQ";
private const string EnablePOPCNT = "COMPlus_EnablePOPCNT";
private const string EnableSSE = "COMPlus_EnableSSE";
private const string EnableSSE2 = "COMPlus_EnableSSE2";
private const string EnableSSE3 = "COMPlus_EnableSSE3";
private const string EnableSSE3_4 = "COMPlus_EnableSSE3_4";
private const string EnableSSE41 = "COMPlus_EnableSSE41";
private const string EnableSSE42 = "COMPlus_EnableSSE42";
private const string EnableSSSE3 = "COMPlus_EnableSSSE3";
private const string FeatureSIMD = "COMPlus_FeatureSIMD";
public class HwIntrinsics_SSE_AVX : Config
{
public HwIntrinsics_SSE_AVX()
{
#if SUPPORTS_RUNTIME_INTRINSICS
if (Avx.IsSupported)
{
this.AddJob(Job.Default.WithRuntime(CoreRuntime.Core31)
.WithId("AVX").AsBaseline());
}
if (Sse.IsSupported)
{
this.AddJob(Job.Default.WithRuntime(CoreRuntime.Core31)
.WithEnvironmentVariables(new EnvironmentVariable(EnableAVX, Off))
.WithId("SSE"));
}
#endif
this.AddJob(Job.Default.WithRuntime(CoreRuntime.Core31)
.WithEnvironmentVariables(new EnvironmentVariable(EnableHWIntrinsic, Off))
.WithId("No HwIntrinsics"));
}
}
}
}

2
tests/ImageSharp.Benchmarks/Config.cs

@ -12,7 +12,7 @@ using BenchmarkDotNet.Jobs;
namespace SixLabors.ImageSharp.Benchmarks namespace SixLabors.ImageSharp.Benchmarks
{ {
public class Config : ManualConfig public partial class Config : ManualConfig
{ {
public Config() public Config()
{ {

54
tests/ImageSharp.Tests/TestUtilities/TestEnvironment.Features.cs

@ -1,54 +0,0 @@
// Copyright (c) Six Labors.
// Licensed under the Apache License, Version 2.0.
namespace SixLabors.ImageSharp.Tests
{
public static partial class TestEnvironment
{
internal static class Features
{
public const string On = "1";
public const string Off = "0";
// See https://github.com/SixLabors/ImageSharp/pull/1229#discussion_r440477861
// * EnableHWIntrinsic
// * EnableSSE
// * EnableSSE2
// * EnableAES
// * EnablePCLMULQDQ
// * EnableSSE3
// * EnableSSSE3
// * EnableSSE41
// * EnableSSE42
// * EnablePOPCNT
// * EnableAVX
// * EnableFMA
// * EnableAVX2
// * EnableBMI1
// * EnableBMI2
// * EnableLZCNT
//
// `FeatureSIMD` ends up impacting all SIMD support(including `System.Numerics`) but not things
// like `LZCNT`, `BMI1`, or `BMI2`
// `EnableSSE3_4` is a legacy switch that exists for compat and is basically the same as `EnableSSE3`
public const string EnableAES = "COMPlus_EnableAES";
public const string EnableAVX = "COMPlus_EnableAVX";
public const string EnableAVX2 = "COMPlus_EnableAVX2";
public const string EnableBMI1 = "COMPlus_EnableBMI1";
public const string EnableBMI2 = "COMPlus_EnableBMI2";
public const string EnableFMA = "COMPlus_EnableFMA";
public const string EnableHWIntrinsic = "COMPlus_EnableHWIntrinsic";
public const string EnableLZCNT = "COMPlus_EnableLZCNT";
public const string EnablePCLMULQDQ = "COMPlus_EnablePCLMULQDQ";
public const string EnablePOPCNT = "COMPlus_EnablePOPCNT";
public const string EnableSSE = "COMPlus_EnableSSE";
public const string EnableSSE2 = "COMPlus_EnableSSE2";
public const string EnableSSE3 = "COMPlus_EnableSSE3";
public const string EnableSSE3_4 = "COMPlus_EnableSSE3_4";
public const string EnableSSE41 = "COMPlus_EnableSSE41";
public const string EnableSSE42 = "COMPlus_EnableSSE42";
public const string EnableSSSE3 = "COMPlus_EnableSSSE3";
public const string FeatureSIMD = "COMPlus_FeatureSIMD";
}
}
}
Loading…
Cancel
Save