C# SIMD向量加速运算简单例子

cs 复制代码
 public unsafe struct VectorOperation<T> where T : struct, INumber<T>
    {
        private T[]? _data = null;
        public VectorOperation()
        {

        }
        public VectorOperation(T[] values)
        {
            _data = values;
        }
        public T[] Data
        {
            get => _data;
            set => _data = value;
        }
        /// <summary>
        /// 累乘
        /// </summary>
        /// <param name="array"></param>
        /// <param name="count"></param>
        /// <returns></returns>
        public T Multiply(T[] array, int count)
        {
            int vectorSize = Vector<T>.Count;
            Vector<T> accVector = Vector<T>.One;
            int i;
            T result = T.One;
            for (i = 0; i <= count - vectorSize; i += vectorSize)
            {
                Vector<T> v = new Vector<T>(array, i);
                accVector = Vector.Multiply(accVector, v);
            }

            for (int j = 0; j < vectorSize; j++)
            {
                result *= accVector[j];
            }

            for (; i < count; i++)
            {
                result *= array[i];
            }

            return result;
        }

        /// <summary>
        /// 元素累加
        /// </summary>
        /// <param name="array"></param>
        /// <param name="count"></param>
        /// <returns></returns>
        public T Sum(T[] array, int count)
        {
            int vectorSize = Vector<T>.Count;
            T result = T.Zero;
            int i;
            for (i = 0; i <= count - vectorSize; i += vectorSize)
            {
                Vector<T> v = new Vector<T>(array, i);
                result += Vector.Sum(v);
            }
            for (; i < array.Length; i++)
            {
                result += array[i];
            }
            return result;
        }

      
    }

上面就简单做了元素累加与累乘,速度也高。

SIMD 是一种在现代 CPU 中广泛使用的并行计算技术。在 SIMD 中,单一的指令可以同时对多个数据进行操作。例如,如果你有两个包含四个元素的数组,你可以使用一条 SIMD 指令来同时对这两个数组的所有元素进行加法运算,而不是分别对每对元素进行加法运算。

复制代码
int vectorSize = Vector<T>.Count;s是对应值类型数组元素数量。

然后for循环vectorSize长度数组一次操作,比如加或者乘;

复制代码
for (; i < array.Length; i++)h后面这个循环是对剩余元素操作,比如int是8bit,一次操作的元素数量是8个,一共有17个元素,操作2次剩余1个元素,剩余的元素另外进行运算。

在此操作上可以加速图像运算,在没有GPU的电脑上运行是非常快了的。

相关推荐
影寂ldy7 分钟前
C# 事件完整学习笔记(发布订阅 + 自定义事件 + 内置 EventHandler)
笔记·学习·c#
体验家12 分钟前
体验家 XMPlus 网页端问卷 SDK 技术解析:用几行 JavaScript 实现精准场景触发与防打扰机制
开发语言·前端·javascript
code_pgf13 分钟前
改进模型架构来减少MLLMs中的幻觉现象
人工智能·深度学习·算法
2301_7644413320 分钟前
基于AI的本地文件归档智能管理工具梳理
人工智能·python·算法·目标检测·交互
二十七剑22 分钟前
LangGraph 源码深度解析:Node 节点 Protocol 与 StateNodeSpec 核心机制
开发语言·python
AC赳赳老秦24 分钟前
OpenClaw + 云数据库运维:自动备份、扩容、迁移 RDS/MySQL 云数据库
运维·开发语言·数据库·人工智能·python·mysql·openclaw
醉城夜风~24 分钟前
类和对象III
开发语言·c++
冷小鱼26 分钟前
高级研发编码习惯:从规范到艺术,再到AI+时代的人机协同
java·开发语言·python·编码习惯
无限码力27 分钟前
美团研发岗 4月18号笔试真题 - 包包的最长公共子序列3
算法·美团笔试题·美团研发岗笔试题·美团机试题
fox_lht38 分钟前
15.4.循环和迭代器的性能比较
开发语言·后端·学习·rust