【一天一点.NET小知识】运用向量Vector<T>加速求和计算
随着 .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,单指令多数据流)
【一天一点.NET小知识】运用向量Vector<T>加速求和计算的更多相关文章
- Linux小知识:CentOS使用Google-BBR加速网络
准备一台centos的服务器查看系统内核:rpm -qa | grep kernel这里需要Linux内核在4.9 RC版本以上,如果版本不是请继续下面操作 访问https://elrepo.org/ ...
- 12个你未必知道的CSS小知识
虽然CSS并不是一种很复杂的技术,但就算你是一个使用CSS多年的高手,仍然会有很多CSS用法/属性/属性值你从来没使用过,甚至从来没听说过. 1.CSS的color属性并非只能用于文本显示 对于CSS ...
- s性能优化方面的小知识
总结的js性能优化方面的小知识 前言 一直在学习javascript,也有看过<犀利开发Jquery内核详解与实践>,对这本书的评价只有两个字犀利,可能是对javascript理解的还不够 ...
- 最近一段时间get到的小知识(c++的)
(1)查看一个程序运行的时间 int main() { clock_t start,end; start=clock(); ... end=clock(); cout<<"Run ...
- JS框架设计读书笔记之-小知识
这一篇写一点小知识 JS中0.1+0.2为什么不等于0.3? 关于这个问题之前也很疑虑,老师也只是笼统的讲这是JS的语言问题,但是内部具体的情况却没有讲,看了书才发现原理如此简单. 简单来讲,计算机识 ...
- react组件中的constructor和super小知识
react组件中的constructor和super小知识 1.react中用class申明的类一些小知识 如上图:类Child是通过class关键字申明,并且继承于类React. A.Child的类 ...
- 蓝牙Bluetooth技术小知识
蓝牙Bluetooth技术以及广泛的应用于各种设备,并将继续在物联网IoT领域担任重要角色.下面搜集整理了一些关于蓝牙技术的小知识,以备参考. 蓝牙Bluetooth技术始创于1994年,其名字来源于 ...
- HTML+CSS中的一些小知识
今天分享一些HTML.CSS的小知识,希望能够对大家有所帮助! 1.解决网页乱码的问题:最重要的是要保证各个环节的字符编码一致! (1)编辑器的编辑环境的字符集(默认字符集):Crtl+U 常见的编码 ...
- iOS APP开发的小知识(分享)
亿合科技小编发现从2007年第一款智能手机横空出世,由此开启了人们的移动智能时代.我们从一开始对APP的陌生,到现在的爱不释手,可见APP开发的出现对我们的生活改变有多巨大.而iOS AP ...
- Unix系统小知识(转)
Unix操作系统的小知识 2.VI添加行号/翻页/清屏 .在对话模式时(即输完Esc再输入: ),输入“:set number”可以将编辑的文本加上行号.跟玩俄罗斯方块一样方便的上下左右移动箭头的快捷 ...
随机推荐
- MSP 通过 Splashtop SOS 远程支持非托管设备
RMM 是 MSP 的绝佳工具.它们使 MSP 可以通过集中控制台来管理其所有客户计算机,通常使他们能够远程访问任何计算机以提供远程支持. 但是,这样做的一个很大限制是--并非所有客户设备都在 MSP ...
- C语言:快速排序(详解)
快速排序采用的是两头对比交换 http://t.csdn.cn/TXcAK 上面这个连接大家可以点进去看看博客李小白大大的图文解释,我觉得这个是对我启发比较大的,对刚接触快速排序的人来说非常友好,很快 ...
- IDS4 傻瓜式实践指南
前言: 这是一篇实践指南,不会过多的解释原理(因为我也说不清楚,想了解的同学请移步老张的博客,里面有非常详细的介绍),本篇文章讲解如何简单的使用IDS4来实现单点登录,以及遇到的一些坑实现功能: 1. ...
- 干货 springcloud之 poenFeign的使用
PoenFeign集成到springcloud项目中 先创建一个springboot项目 这里就不多说了 application.yml文件: server: port: 8082spring: ap ...
- PHP 中使用 ElasticSearch 的最佳实践 (中)
引言 在上一篇文章当中,我们介绍了如何在 ElasticSearch 中创建索引以及建立字段映射关系. 接下来的这篇文章,我们将在 Laravel 中对商品信息进行增删改查及搜索. 记得 Elasti ...
- golang的 CGO 是什么
CGO是Go(Golang)语言中的一个工具,全称为 "C-Go" 或者 "C for Go". 它是Go标准库的一部分,允许Go代码与C语言代码进行交互. C ...
- centos 7 mysql8 安装和卸载
cent os 7 安装 mysql 8--install-start官网下载MySQL的RPM源,地址:https://dev.mysql.com/downloads/repo/yum/ 下载这个项 ...
- .NET5 IIS ASP.NET CORE 部署时 HTTP Error 502.5 - ANCM Out-Of-Process Startup Failure
.NET5 IIS ASP.NET CORE 部署时 HTTP Error 502.5 - ANCM Out-Of-Process Startup Failure 部署机器只安装了dotnet-hos ...
- CTF反序列化wp(ciscn,nss,ctfshowweb入门)
[CISCN 2023 华北]ez_date 题目: <?php error_reporting(0); highlight_file(__FILE__); class date{ public ...
- spring jpa restful请求示例
创建项目 导入jar包mysql 数据库和连接池jar <dependency> <groupId>org.springframework.boot</groupId&g ...