static float Sum(float[] values)
{
float total = 0;
for (int i = 0; i < values.Length; i++)
total += values[i];
return total;
}
使用
SIMD 加總
/// <summary>
/// SIMD 向量化加總
/// </summary>
static float SumSimd(float[] data)
{
var vectorSize = Vector<float>.Count;
var i = 0;
var vsum = Vector<float>.Zero;
// 每次處理 vectorSize 筆
for (; i <= data.Length - vectorSize; i += vectorSize)
{
var v = new Vector<float>(data, i);
vsum += v;
}
// 把向量的各元素加起來
var total = 0f;
for (int j = 0; j < vectorSize; j++)
total += vsum[j];
// 處理尾端剩餘元素
for (; i < data.Length; i++)
total += data[i];
return total;
}
執行程式碼:
for (var i = 1; i <= 10; i++)
{
var faker = new Faker("en");
var data = Enumerable.Range(1, 100_000_000)
.Select(_ => faker.Random.Float(0, 10))
.ToArray();
var sw = new Stopwatch();
sw.Start();
Sum(data);
Console.WriteLine(sw.Elapsed);
}
Console.WriteLine("--- SIMD ---");
for (var i = 1; i <= 5; i++)
{
var faker = new Faker("en");
var data = Enumerable.Range(1, 100_000_000)
.Select(_ => faker.Random.Float(0, 10))
.ToArray();
var sw = new Stopwatch();
sw.Start();
SumSimd(data);
Console.WriteLine(sw.Elapsed);
}