Skip to content

Instantly share code, notes, and snippets.

@DBalashov
Created June 14, 2023 14:32
Show Gist options
  • Save DBalashov/b0f0645324d83a840f7bf187f6f74d28 to your computer and use it in GitHub Desktop.
Save DBalashov/b0f0645324d83a840f7bf187f6f74d28 to your computer and use it in GitHub Desktop.
Find element in array
using System.Runtime.Intrinsics;
using System.Runtime.Intrinsics.X86;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Jobs;
using BenchmarkDotNet.Running;
#pragma warning disable CS8618
var summary = BenchmarkRunner.Run<MainTest>();
[SimpleJob(RuntimeMoniker.Net70, baseline: true)]
[WarmupCount(2)]
[IterationCount(2)]
[MemoryDiagnoser]
public class MainTest
{
const int N = 1_000_000;
const int ITERATIONS = 10000;
int[] src;
[IterationSetup]
public void Setup()
{
src = Enumerable.Range(0, N).Concat(Enumerable.Range(0, N)).Append(-1).ToArray();
}
[Benchmark]
public int TestForEach()
{
var r = 0;
for (var iteration = 0; iteration < ITERATIONS; iteration++)
{
r = 0;
foreach (var s in src)
r ^= s;
}
return r;
}
[Benchmark]
public unsafe int TestVector128()
{
var r = 0;
for (var iteration = 0; iteration < ITERATIONS; iteration++)
{
fixed (int* srcPtr = src)
{
var pointer = srcPtr;
var acc = Vector128<int>.Zero;
for (var i = 0; i < src.Length / 4; i++, pointer += 4)
acc = Sse2.Xor(acc, Vector128.Load(pointer));
r = 0;
for (var i = 0; i < 4; i++)
r ^= acc.GetElement(i);
}
for (var i = src.Length / 4 * 4; i < src.Length; i++)
r ^= src[i];
}
return r;
}
[Benchmark]
public unsafe int TestVector256()
{
var r = 0;
for (var iteration = 0; iteration < ITERATIONS; iteration++)
{
fixed (int* srcPtr = src)
{
var pointer = srcPtr;
var acc = Vector256<int>.Zero;
for (var i = 0; i < src.Length / 8; i++, pointer += 8)
acc = Avx2.Xor(acc, Vector256.Load(pointer));
r = 0;
for (var i = 0; i < 8; i++)
r ^= acc.GetElement(i);
for (var i = src.Length / 8 * 8; i < src.Length; i++)
r ^= src[i];
}
}
return r;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment