当前位置: 首页 > news >正文

C#并行计算(SIMD)应用

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;}}
}

复制代码

image

image

http://www.dtcms.com/a/355956.html

相关文章:

  • illustrator-02
  • 洛谷 P2568 GCD-提高+/省选−
  • 「Java EE开发指南」如何使用MyEclipse启用自动JSP验证?
  • C语言————函数递归(通俗易懂)
  • logcat 网络日志解析
  • 二、开关电源的EMC改善措施
  • Python Imaging Library (PIL) 全面指南:PIL基础入门-图像处理与数据预处理
  • Maven 编译打包一个比较有趣的问题
  • yolo学习笔记01——前置基础
  • 【力扣】2715. 执行可取消的延迟函数
  • 生产环境Vue组件报错:Cannot access before initialization
  • 将 agents 连接到 Elasticsearch 使用模型上下文协议 - docker
  • 前后端分离情况下,将本地vue项目和Laravel项目以及mysql放到自己的云服务器
  • 工业 5G + AI:智能制造的未来引擎
  • Mybatis-增删改查
  • 逻辑回归以及损失函数
  • 数字孪生(Digital Twin):未来产业与城市的智慧引擎
  • AI Agent从0到1:剖析Block与GSK的两种产品化落地路径
  • 容器学习04-kubernetes(k8s)
  • 海康相机开发---设备登录
  • (二分查找)Leetcode34. 在排序数组中查找元素的第一个和最后一个位置+74. 搜索二维矩阵
  • 【LInux】常用命令笔记
  • Linux之Shell编程(一)
  • 异步方法和多线程有什么区别,他们的实现逻辑是什么以及为什么异步方法: 不能和调用者在同一个类中
  • VisionPro联合编程控件导入WinFrom以及VS卡死问题
  • GCC版本和C语言标准版本的对应关系
  • 一个Demo射击小计(纯蓝图)
  • 前端学习 10-1 :验证中的UVM
  • .Net Core Web 架构(管道机制)的底层实现
  • jadx反向编译JAR包