Skip to content

Instantly share code, notes, and snippets.

@arekbal
Created October 21, 2018 16:50
Show Gist options
  • Save arekbal/dd84cd710afc5f7be95eafa0324c1fb3 to your computer and use it in GitHub Desktop.
Save arekbal/dd84cd710afc5f7be95eafa0324c1fb3 to your computer and use it in GitHub Desktop.
public class vectorization_locality
{
int[] data;
int baseSum;
public vectorization_locality()
{
data = Enumerable.Range(1, 999).ToArray();
var length = data.Length;
for (var i = 0; i < length; i++)
baseSum += data[i];
}
[Benchmark(Baseline = true)]
public void array()
{
var sum = 0;
var length = data.Length;
for(var i = 0; i < length; i++)
sum += data[i];
if (baseSum != sum)
throw new Exception("baseSum != sum");
}
[Benchmark]
public void vectorized()
{
var sum = 0;
var vectorItemCount = Vector<int>.Count;
var length = data.Length;
length = data.Length - (length % vectorItemCount);
unsafe
{
var spanLength = length / vectorItemCount;
var span = new Span<Vector<int>>(Unsafe.AsPointer(ref data[0]), spanLength);
if (spanLength > 0)
{
var x = span[0];
for (var i = 1; i < spanLength; i++)
{
x += span[i];
}
for (var i = 0; i < vectorItemCount; i++)
sum += x[i];
}
for(var i = length; i < data.Length; i++)
{
sum += data[i];
}
}
if (baseSum != sum)
throw new Exception("baseSum != sum");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment