【一天一点.NET小知识】运用向量VectorT加速求和计算

随着 .NET 版本的演进,从 .NET Standard 2.0 版本开始,支持 Vector<T> 类型。
Vector<T> 类型:表示指定数值类型(适用于并行算法的低级别优化)的单个向量。

假如我们有一个求和函数接受一个int数组入参,当它的长度大于等于8及其倍数以上时,那么我们就可以考虑使用向量Vector<T>加速求和计算。

以下是使用了向量的求和函数代码:

internal class Program
{static void Main(string[] args){int[] array = Enumerable.Range(1, 32).ToArray();int result = Sum(array);Console.WriteLine(result);Console.ReadKey();}public static int Sum(int[] numbers){ReadOnlySpan<int> span = new ReadOnlySpan<int>(numbers);ref int ptr = ref MemoryMarshal.GetReference(span);int result = 0;int vectorSize = Vector<int>.Count;int index;int remainder = span.Length % vectorSize;int vectorLength = span.Length - remainder;Vector<int> vector = Vector<int>.Zero;for (index = 0; index < vectorLength; index += vectorSize){//Vector<int> vector2 = new Vector<int>(span.Slice(index, vectorSize));ref byte address = ref Unsafe.As<int, byte>(ref Unsafe.Add(ref Unsafe.AsRef(in ptr), index));Vector<int> vector2 = Unsafe.ReadUnaligned<Vector<int>>(ref address);vector += vector2;}result += Vector.Dot<int>(vector, Vector<int>.One);for (; index < span.Length; index++){result += Unsafe.Add(ref ptr, index);}return result;}
}

以下是相减函数代码:

static int Sub(int[] numbers)
{ReadOnlySpan<int> span = new ReadOnlySpan<int>(numbers);ref int ptr = ref MemoryMarshal.GetReference(span);int result = 0;int vectorSize = Vector<int>.Count;int index;int remainder = span.Length % vectorSize;int vectorLength = span.Length - remainder;for (index = 0; index < vectorLength; index += vectorSize){ref byte address = ref Unsafe.As<int, byte>(ref Unsafe.Add(ref Unsafe.AsRef(in ptr), index));Vector<int> vector = Unsafe.ReadUnaligned<Vector<int>>(ref address);result -= Vector.Dot<int>(vector, Vector<int>.One);}for (; index < span.Length; index++){result -= Unsafe.Add(ref ptr, index);}return result + 2;
}

其它运算,例如相减,也是同理。
当我们向量 Vector<T> 之后,特别是在一些频繁调用计算的场景,将获得指数量级的性能提升。
需要注意的是,向量 Vector<T> 依赖 CPU 硬件的 SIMD 指令集支持,在一些相对较旧的 古董CPU,可能不支持。

PS:

  • uint类型数组,长度大于等于8及其倍数以上
  • long类型数组,长度大于等于4及其倍数以上
  • ulong类型数组,长度大于等于4及其倍数以上
  • SIMD(Single Instruction, Multiple Data,单指令多数据流)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/741431.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实战篇——CSRF漏洞pikachu靶场实战

实战篇——CSRF漏洞pikachu靶场实战 CSRF的原理 攻击者利用用户在某个网站上的已登录状态,诱使用户点击恶意链接,恶意页面会向服务器自动发送预先准备好的恶意请求。由于请求中自动包含了用户的认证凭证,服务器会误以为是合法的用户操作,从而执行恶意请求。 CSRF的分类 (1)…

Bulldog_2 靶机提权

一、目标环境 攻击者(kali)、目标服务器(ubuntu) 二、信息收集 1、探测靶机 使用fscan进行探测 ./fscan -h ip 段发现目标地址,并且还发现对方开启了80端口 三、目标站点的访问以及检测然后发现两个接口,分别是登陆和注册的然后就是在登陆接口这边尝试一下弱口令发现并不…

PySimpleGUI笔记

本博客详细介绍了 PySimpleGUI 的基本用法和高级功能,并通过实际案例演示了如何使用 PySimpleGUI 开发图形用户界面 (GUI) 应用。主要内容包括:基本用法:介绍了 PySimpleGUI 的基本组件和窗口创建方法,通过简单示例展示了如何创建和管理窗口。 事件处理:讲解了如何处理用户…

忆 2015 硅谷之行

2015 硅谷之行 ,是我脑海里一段充满海蓝色的记忆。 有点像刘姥姥进大观园,也有点像进入另外一个我不曾幻想过的世界。 郊区很美 我们住在郊区,人很少,景色很美。每次去吃饭,还得驱车 15 分钟左右去附近最近的餐厅。Google 总部 Google 对于每个程序员来讲,都是一个梦幻的…

py并发编程

并发编程(并发,并行,同步,异步) 通俗理解并发编程中的相关核心概念 核心概念:进程、线程CPU的作用计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。 CPU的核数(多核计算机多个CPU,大部分情况下也只是用了一核CPU)假定工厂的电力有限,一次只…

Android studio导出apk文件

在Android studio中打开项目 选择build——》 build bundle(s)/apk(s)——》build apk(s) 加载完成后点击右下角弹窗的local(或者在  项目地址\app\build\outputs\apk\debug  中找到apk文件) 将apk文件复制到对应设备上就可以啦(最好别用qq)

JDK、JRE、JVM

JDK:Java Development Kit JRE: Java Runtime Environment JVM: Java Virtual Machine

[CINTA] 具体数论与代数阅读笔记——第一章 整数和二进制(含加、乘、除)

这里是王立斌老师的《具体数论与代数》(CINTA)的阅读笔记前言 这本书说自己是计算机专业数学入门之入门,成为读者攻读其他经典著作的垫脚石,但个人以为足矣替换掉本校内不知所云的、抽象的、让学生考完后马上全忘的那些课程。本书的 GitHub 仓库在这里。 该笔记并非单纯的整…

热爱无限

青春不在年华,而在心境;青春不是桃面、丹唇、柔膝,而是深沉的意志、恢弘的想象、炙热的情感,更是生命中无限的热爱。它使你有一台天线,从天上接受着勇气与力量的信号,使你青春永驻。 怀揣着热爱,我投入到无限的学习之中。当我第一次接触信息学竞赛时,就被其中无限的知识…

Franka Robot 错误处理

使用 FCI 时,您会遇到多种错误,这些错误可能是由于用户发送的不合规命令、通信问题或机器人行为而导致的。以下小节详细介绍了最相关的错误。有关完整列表,请查看 API文档。请注意,发生错误后,您可以自动清除错误并继续使用该franka::Robot::automaticErrorRecovery()命令…

Mybatis Plus 3.X版本的insert填充自增id的IdType.ID_WORKER策略源码分析

总结/朱季谦 某天同事突然问我,你知道Mybatis Plus的insert方法,插入数据后自增id是如何自增的吗? 我愣了一下,脑海里只想到,当在POJO类的id设置一个自增策略后,例如@TableId(value = "id",type = IdType.ID_WORKER)的注解策略时,就能实现在每次数据插入数据库…

共享ip服务器实现外网访问

信息 服务器厂商:炎火云 系统:Windows-2012R2-Datacenter-cn 面板:phpstudy 共享ip服务器实现外网访问思路 通过nat端口映射将内网端口映射到共享ip(即公网ip)端口,实现使用共享ip+端口访问服务器 步骤 首先确定好服务器端口 我这里用的是默认的80端口接着要在防火墙里面…