【一天一点.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”可以将编辑的文本加上行号.跟玩俄罗斯方块一样方便的上下左右移动箭头的快捷 ...
随机推荐
- uniapp去除button的边框
button { border: none !important; } button::after { border: none !important; }
- OpenNESS NTS 的前世今生
目录 文章目录 目录 NEV SDK NEV SDK 的软件架构 NEV SDK 的持续演进 OpenNESS NTS NTS 在 VM 场景中的应用 NTS 在 Container 场景中的应用 N ...
- 14个Flink SQL性能优化实践分享
本文分享自华为云社区<Flink SQL性能优化实践> ,作者:超梦. 在大数据处理领域,Apache Flink以其流处理和批处理一体化的能力,成为许多企业的首选.然而,随着数据量的增长 ...
- GeminiDB PITR,让游戏回档“进退自如”!
本文分享自华为云社区<GeminiDB PITR,让游戏回档"进退自如"!>,作者:GaussDB 数据库. 在实际业务场景中,客户数据库难免会出现数据损毁.数据丢失. ...
- Docker批量删除容器/镜像
1.删除所有的容器 docker rm `docker ps -a -q` 2.删除所有的镜像 docker rmi `docker images -q` 提示: -q参数:只显示容器ID
- Yii AR事务操作
Yii Ar事务操作,示例代码如下: $model=Post::model(); $transaction=$model->dbConnection->beginTransaction() ...
- iOS符号表手工还原
1.通过Xcode的Device工具导出app.crash文件 2.将.crash 和 .dSYM符号 app放在同一个目录中 3.寻找symbolicatecrash,将symbolicatecra ...
- MySQL学习笔记-数据定义语言
SQL-数据定义语言(DDL) 一.操作数据库 1.查询 # 查询所有数据库 show databases; # 查询当前数据库 select database(); 2.创建 create data ...
- 逻辑卷缩容报错 xfs_growfs: /dev/new/new_box is not a mounted XFS filesystem
[root@server ~]# xfs_growfs /dev/new/new_box xfs_growfs: /dev/new/new_box is not a mounted XFS files ...
- JAVA发送邮件报错: 535 Error: authentication failed, system busy。
解决方法: 1.设置 -> 微信绑定 -> 开启安全登录 -> 生成新密码 2.使用生成的新密码替换邮箱登录密