using System.Numerics;namespace SIMDDemo
{internal class Program{/* 实战案例:200万数据点的统计计算场景描述- 数据量:200万个float类型的测量点- 计算需求:最大值、最小值、平均值- 性能要求:毫秒级响应,支持生产线实时检测SIMD向量化处理:使用System.Numerics.Vector<T>实现单指令多数据流处理,一次性处理多个数据点(取决于硬件,通常是4或8个float),大幅减少循环迭代次数* */static void Main(string[] args){// 生成测试数据 (200万个随机float值)int createCount = 16;//2000000Console.WriteLine("\r\n生成测试数据");float[] data = new float[createCount];Random rand = new Random();for (int i = 0; i < data.Length; i++){data[i] = (float)(rand.NextDouble() * 1000);}Console.WriteLine(string.Join("\r\n", data));// 计算统计量并测量时间var stopwatch = System.Diagnostics.Stopwatch.StartNew();CalculateStatistics(data,out float min,out float max,out float mean);stopwatch.Stop();Console.WriteLine("\r\n输出结果");Console.WriteLine($"数据量: {data.Length:N0}");Console.WriteLine($"最小值: {min:F4}");Console.WriteLine($"最大值: {max:F4}");Console.WriteLine($"平均值: {mean:F4}");Console.WriteLine($"计算耗时: {stopwatch.ElapsedMilliseconds} ms");}static void CalculateStatistics(float[] data, out float min, out float max, out float mean){int length = data.Length;int vectorSize = Vector<float>.Count;// 向量大小:8int i = 0;// 初始化SIMD向量var vMin = new Vector<float>(float.MaxValue);var vMax = new Vector<float>(float.MinValue);var vSum = Vector<float>.Zero;// 处理向量化部分(SIMD)for (; i <= length - vectorSize; i += vectorSize){var vData = new Vector<float>(data, i);// 单指令多数据流处理 <594.0291, 805.2193, 795.9451, 39.850945, 715.462, 330.4536, 281.41626, 497.84033>vMin = Vector.Min(vMin, vData);vMax = Vector.Max(vMax, vData);vSum += vData;}// 提取向量化结果min = ExtractMin(vMin);max = ExtractMax(vMax);float sum = ExtractSum(vSum);// 处理剩余的非向量化数据for (; i < length; i++){float value = data[i];min = Math.Min(min, value);max = Math.Max(max, value);sum += value;}mean = sum / length; // 计算平均值}static float ExtractMin(Vector<float> vector){float min = float.MaxValue;for (int i = 0; i < Vector<float>.Count; i++){min = Math.Min(min, vector[i]);}return min;}static float ExtractMax(Vector<float> vector){float max = float.MinValue;for (int i = 0; i < Vector<float>.Count; i++){max = Math.Max(max, vector[i]);}return max;}private static float ExtractSum(Vector<float> vector){float sum = 0;for (int i = 0; i < Vector<float>.Count; i++){sum += vector[i];}return sum;}}
}


