随着 .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>加速求和计算的更多相关文章

  1. Linux小知识:CentOS使用Google-BBR加速网络

    准备一台centos的服务器查看系统内核:rpm -qa | grep kernel这里需要Linux内核在4.9 RC版本以上,如果版本不是请继续下面操作 访问https://elrepo.org/ ...

  2. 12个你未必知道的CSS小知识

    虽然CSS并不是一种很复杂的技术,但就算你是一个使用CSS多年的高手,仍然会有很多CSS用法/属性/属性值你从来没使用过,甚至从来没听说过. 1.CSS的color属性并非只能用于文本显示 对于CSS ...

  3. s性能优化方面的小知识

    总结的js性能优化方面的小知识 前言 一直在学习javascript,也有看过<犀利开发Jquery内核详解与实践>,对这本书的评价只有两个字犀利,可能是对javascript理解的还不够 ...

  4. 最近一段时间get到的小知识(c++的)

    (1)查看一个程序运行的时间 int main() { clock_t start,end; start=clock(); ... end=clock(); cout<<"Run ...

  5. JS框架设计读书笔记之-小知识

    这一篇写一点小知识 JS中0.1+0.2为什么不等于0.3? 关于这个问题之前也很疑虑,老师也只是笼统的讲这是JS的语言问题,但是内部具体的情况却没有讲,看了书才发现原理如此简单. 简单来讲,计算机识 ...

  6. react组件中的constructor和super小知识

    react组件中的constructor和super小知识 1.react中用class申明的类一些小知识 如上图:类Child是通过class关键字申明,并且继承于类React. A.Child的类 ...

  7. 蓝牙Bluetooth技术小知识

    蓝牙Bluetooth技术以及广泛的应用于各种设备,并将继续在物联网IoT领域担任重要角色.下面搜集整理了一些关于蓝牙技术的小知识,以备参考. 蓝牙Bluetooth技术始创于1994年,其名字来源于 ...

  8. HTML+CSS中的一些小知识

    今天分享一些HTML.CSS的小知识,希望能够对大家有所帮助! 1.解决网页乱码的问题:最重要的是要保证各个环节的字符编码一致! (1)编辑器的编辑环境的字符集(默认字符集):Crtl+U 常见的编码 ...

  9. iOS APP开发的小知识(分享)

          亿合科技小编发现从2007年第一款智能手机横空出世,由此开启了人们的移动智能时代.我们从一开始对APP的陌生,到现在的爱不释手,可见APP开发的出现对我们的生活改变有多巨大.而iOS AP ...

  10. Unix系统小知识(转)

    Unix操作系统的小知识 2.VI添加行号/翻页/清屏 .在对话模式时(即输完Esc再输入: ),输入“:set number”可以将编辑的文本加上行号.跟玩俄罗斯方块一样方便的上下左右移动箭头的快捷 ...

随机推荐

  1. postgresql 去重&查最新一组记录 关键词partition by

  2. js图片懒加载,在不做分页的情况下的解决方案

    Intersection Observer API 1.注意点 一般都是后端返回数据, 用 this.$nextTick(() => { this.handleScroll(); }); 确保d ...

  3. UE4 InstancedStaticMesh使用

    在绘制大批量近似模型时,Unity有GPU Instancing(https://www.cnblogs.com/hont/p/7143626.html),而UE中有 HISM和ISM(Instanc ...

  4. Stable Diffusion 术语表

    Stable Diffusion 术语表 说明 原文地址:https://theally.notion.site/The-Definitive-Stable-Diffusion-Glossary-1d ...

  5. 如果个人pc上要装不同社区版本的pycharm,安装时需要注意的一点

    pycharm下载地址[包含了目前发行的所有版本]:https://www.jetbrains.com/pycharm/download/other.html 选择指定的版本,点击 勾选uninsta ...

  6. 如何使用Charles查看页面接口请求?

    1.Charles下载地址: https://www.charlesproxy.com/latest-release/download.do 2.如何抓取浏览器的操作 2.1 点击映射 2.2 点击映 ...

  7. nginx学习记录【一】在windows上的安装nginx的教程

    1.下载地址 http://nginx.org/en/download.html 2.选择windows版本 如下图: 3.解压并运行 解压到指定目录,如下图 打开cmd,然后cd到那个目录,如下图: ...

  8. java中判断String类型为空和null的方法

    1.判断一个String类型的变量是否为空(即长度为0)或者为null 在Java中,判断一个String类型的变量是否为空(即长度为0)或者为null,通常需要使用两个条件语句来进行检查.这是因为n ...

  9. wireshark常见使用技巧

    (1)wireshark根据报文不同字段排序 举例说明:现在有50000个1588 sync报文,我想根据报文的originalTimestamp(seconds)字段进行排序,该如何操作呢? 操作过 ...

  10. B站login-极验逆向

    声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 目标网站 https:// ...