概述

Vector(向量)是一种序列式容器,事实上和数组差不多,但它比数组更优越。一般来说数组不能动态拓展,因此在程序运行的时候不是浪费内存,就是造成越界。而Vector刚好弥补了这个缺陷,它的特征是相当于可分配拓展的数组(动态数组),它的随机访问快,在中间插入和删除慢,但在末端插入和删除快。

什么是SIMD?

SIMD是Single Instruction Multiple Data的缩写,通常中文译为单指令多数据流,通俗来讲的话是:对多个数据执行同一个CPU指令,以达到平行运算的目的.

在GPU之前我们会通过CPU来运行该项技术来增加图片的运算速度,例如Intel的MMX、SSE、SSE2、AVX,AMD的3DNow!等等,都是来使用SIMD
为基础的概念,在GPU技术突飞猛进的今天,CPU的SIMD技术很少用在了图片运算方面了,更多的是在资料库或者其他用途上。

它适用于机器学习、加密算法、数据库、和内容处理(视频、图像、音频编码)中,是多线程不错的选择。

为什么要使用SIMD

SIMD可以在多条数据通道中应用相同的操作,显著的来提高CPU性能,通常,通道越多,性能越高(只要代码符合处理器的指令集)

Vector

Vector和Vector<T>类为我们提供了SIMD(单指令,多数据)指令集(SSE,AVX)的调用方式,可以让我们像在C/C++中一样去调用内在函数,来直接操作大多数的SIMD指令了

Vector<T>可以为任何的数字类型(sbyte, byte, short, ushort, int, uint, long, ulong, float, double),参考MSDocs

另外我们在System.Runtime.Intrinsics可享受与平台无关的功能,也就是我们不用花费时间在不同平台的兼容方面。

顺便再说一下System.Runtime.Intrinsics.X86在这个命名空间下,提供了SSE,SSE2,SSE3,SSSE3,SSE4.1,SSE4.2,AVX,AVX2,FMA,LZCNT,POPCNT,BMI1,BMI2,PCLMULQDQ和AES的不同Intel ISA的类的指令集。例如:在Avx类中提供了许多静态方法,而每个AVX方法都映射到了AVX的指令
,但是在这里有一点我们需要注意的是在这需要去通过IsSupported去检查硬件是否支持该功能。

定义及初始化

在这之前我们可以通过Vector.IsHardwareAccelerated来判断硬件是否支持SIMD。

if (Vector.IsHardwareAccelerated == false)
{//fallback to some other code;return;
}
//创建Vector 重复相同的值
double[] doubArray = new double[] { 1, 2, 3, 4, 4, 3, 2, 1, -1, -2, -3, -4, -5 };
Span<double> douSpan = new Span<double>(doubArray, 8, 4);
Vector<double> douZero = Vector<double>.Zero;//<0, 0, 0, 0>
Vector<float> flOne = Vector<float>.One;//<1, 1, 1, 1, 0, 0, 0, 0>
Vector<ushort> shAny = new Vector<ushort>(20);//<20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0>
Vector<double> douV = new Vector<double>(doubArray); //Will contain <1, 2, 3, 4>
Vector<double> spanduoV = new Vector<double>(douSpan); //Will contain <-1, -2, -3, -4>
Vector<double> dou2V = new Vector<double>(doubArray, 5); //Will contain <3, 2, 1, -1>
Vector<double> sumV = douV + dou2V; //Will contain <4, 4, 4, 3>

在具有AVX/AVX2功能的系统中,以上指令将创建包含4个重复的double,8个重复的float和16个重复的ushort的向量。
另外Vector可以通过数组和Span的值进行创建

.NET中最原始的SIMD加速类型是Vector2、Vector3和Vector4类型,它们用2、3和4个单个值表示向量。下面的例子使用Vector2来添加两个向量。

var v1 = new Vector2(0.1f, 0.2f);
var v2 = new Vector2(1.1f, 2.2f);
var vResult = v1 + v2;//1.2 2.4

数学运算

可以使用.NET向量计算载体如其他数学性质Dot product,Transform,Clamp等等。

var v1 = new Vector2(0.1f, 0.2f);
var v2 = new Vector2(1.1f, 2.2f);
var vResult1 = Vector2.Dot(v1, v2); //0.55
var vResult2 = Vector2.Distance(v1, v2); //2.236068
var vResult3 = Vector2.Clamp(v1, Vector2.Zero, Vector2.One);//0.1 0.2

Vector<T>可以使用更长的向量。 Vector<T>实例的计数是固定的,但是其值Vector<T>.Count取决于运行代码的计算机的CPU。

下面的示例演示使用Vector<T>添加长数组元素。

double[] SimdVectorProd(double[] left, double[] right)
{var offset = Vector<double>.Count;double[] result = new double[left.Length];int i = 0;for (i = 0; i < left.Length; i += offset){var v1 = new Vector<double>(left, i);var v2 = new Vector<double>(right, i);(v1 * v2).CopyTo(result, i);}//remaining itemsfor (; i < left.Length; ++i){result[i] = left[i] * right[i];}return result;
}

https://docs.microsoft.com/zh-cn/dotnet/standard/simd

https://github.com/CBGonzalez/SIMDIntro

探索.NET平台中的SIMD内在函数Vector相关推荐

  1. golang 大数据平台_人工智能大数据平台中Golang的应用实践

    原标题:人工智能大数据平台中Golang的应用实践 分享人: 薛磊,Momenta资深研发工程师,前Sun中国工程研究院工程师,专注于分布式系统.存储系统.容器等技术,目前从事深度学习训练平台的基础架 ...

  2. 开发淘宝开放平台中的B端或者C端小程序,后端调用api使用的sessionKey如何获取?

    开发淘宝开放平台中的B端(千牛端)或者C端小程序,后端调用api使用的sessionKey如何获取? TaobaoClient client = new DefaultTaobaoClient(url ...

  3. Unity中的Path对应各平台中的Path

    Unity中的Path对应各平台中的Path http://www.manew.com/thread-21404-1-1.html (出处: -[游戏蛮牛]-ar增强现实,虚拟现实,unity3d,u ...

  4. 用计算机探索ppt,信息技术应用 用计算机画函数图象ppt课件配套教案内容

    孙丹 地区: 河南省 - 许昌市 - 东城区 学校:许昌市东城区实验学校中学部 共1课时 信息技术应用 用计算机画函数图象">信息技术应用 用计算机- 初中数学       人教201 ...

  5. Python笔记-windows平台中Flask打包成exe

    这里使用pyinstaller进行打包,先安装他. pip install -i https://pypi.douban.com/simple/ pyinstaller 这里的manager.py就是 ...

  6. java调用c 返回值_推荐--Linux平台下Java调用C函数(补充关于String类型函数返回值)...

    平台介绍 系统:ubuntu10.04 jdk:Java(TM) SE Runtime Environment (build 1.6.0_20-b02) gcc:gcc version 4.4.3 ( ...

  7. 用matlab画5日均线,用MATLAB求移动平均线,不用MOVAVG函数,求MA5,MA10 – MATLAB中文论坛...

    移动平均线,简称均线.它是将某一段时间的收盘价之和除以该周期. 比如日线MA5指5天内的收盘价除以5 .请在一张图中用三种不同颜色绘制该股票收盘价数据.5日移动平均MA5.10日移动平均MA10. 时 ...

  8. Win10平台中ANSYS 18.2二次开发环境搭建及关联教程

    笔者关于ANSYS二次开发平台搭建的基础知识均从师访老师在仿真论坛的帖子(链接:https://forum.simwe.com/thread-1021888-1-1.html)里以及他的<ANS ...

  9. Linux平台下Java调用C函数

    JNI是Java native interface的简写,可以译作Java原生接口.Java可以通过JNI调用C/C++的库,这对于那些对性能要求比较高的Java程序无疑是一个 福音. 使用JNI也是 ...

最新文章

  1. autosar中com模块_详细介绍AUTOSAR各个模块作用PART1(OS,SYS)
  2. JavaScript改变 HTML 内容
  3. Android 浅谈动画
  4. 【干货】运维,你是青铜还是王者?
  5. 【论文学习】高频分量有助解释卷积神经网络泛化 High-frequency Component Helps Explain the Generalization of CNN
  6. [转]Visual Studio 项目类型 GUID 清单
  7. PAZU 是4Fang 为配合“四方在线”软件于2004年开发的WEB打印控件,适用于各种WEB软件项目的打印。...
  8. 51. N皇后/52. N皇后 II
  9. 11.2 正睿停课训练 Day15
  10. HDU2004 成绩转换【入门】
  11. 页面动态加载android,Android APP启动页面动态加载全部权限
  12. 细数那些不能直视的IE6BUG
  13. 简单整蛊室友,只需几行bat病毒代码
  14. iVX开发过程整理的常见问题与回答(二)
  15. 【技术类】ArcGIS里做影像分幅裁剪
  16. sketch-code让草图秒变HTML
  17. 使用oracle.jdbc.OracleDriver
  18. zblog php wordpress,zblog和wordpress哪个好
  19. 【大数据处理技术】实验11
  20. XP系统加入域提示无法找到网络路径处理方法

热门文章

  1. SQL 查询数据库中包含指定字符串的相关表和相关记录
  2. SimMechanics/Second Generation倒立摆模型建立及初步仿真学习
  3. java.util.ListIterator
  4. 【原】Python基础-函数
  5. ExtJs Grid分页时序号自增的实现,以及查询以后的序号的处理
  6. 动态的管理ASP.NET DataGrid数据列【转载】
  7. 深圳dotnet俱乐部新群
  8. 计算机启动程序bios_如何构建自己的计算机,第三部分:准备BIOS
  9. jquery文档加载完毕后执行的几种写法
  10. Docker Storm开发环境搭建