探索.NET平台中的SIMD内在函数Vector

概述

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 items
      for (; 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

(0)

相关推荐

  • AVX指令集是什么?它的应用又有哪些?

    很多读者朋友可能在阅读我们的文章时经常会看到AVX指令集这个名词,比如说在CPU评测中就往往能够看到它的身影,一些新入坑的玩家可能会不明白这个名词的含义,今天这篇文章就简单介绍一下该指令集的来龙去脉, ...

  • 30万本金,该如何分配到P2P平台中?

    目前手里有30多万闲钱投资网贷的人越来越多,有读者在问30万本金该如何分配到P2P平台中,今天就聊一聊个人的看法. 一.第一步是精选平台 所谓精选平台,并不是一定要挑选风险最低的平台,而是要找出投资性 ...

  • 暑假在家学习,推荐国家中小学网络云平台中...

    暑假在家学习,推荐国家中小学网络云平台 中小学暑假倒计时,作为家长,您还在为孩子的学习而发愁吗?选择什么样的培训机构?暑假补课预算花多少钱? 给您推荐国家中小学网络云平台,只要家里有网络,就可以上课. ...

  • 借由探索外在身体,发现理解内在习性

    借由探索外在身体,发现理解内在习性. 正念(冥想)实修&感悟7.26 正念瑜伽

  • OMO教育是什么?如何应用到在线教育平台中?

    在近两年的教育行业新热词中,"OMO模式"倒是格外显眼. 那么啥是OMO教育? 教育行业的OMO模式指的是以提升教学效果和体验为核心,深度融合线上与线下的学习场景,从而实现标准化流 ...

  • 内在探索

    小学同学约明晚小范围聚会,我稍觉遗憾,其实既然相见,我宁愿所有同学一起见,看看那些我记得或不记得的同学,如今都是什么模样?我是要继续回忆他们当初的样子,还是就像初识的朋友,重新去接受和了解呢?我充满好 ...

  • 这是一场三天两夜的内在探索之旅

    遇见线下体验营课程介绍 每个生命都有需要穿越黑暗的时刻,但我们不必躲在黑暗中独自哀伤,而要让自己的心灵在高频的场域中得到滋养: 和优秀的老师零距离交流,点拨智慧,和同频的人一起抱团取暖: 一层一层向内 ...

  • 思享 | 刘小平:黄宗羲的“法”理论及其内在转向

    来源 <法制与社会发展>2020年第5期 作者简介 # 刘小平 吉林大学法学院.理论法学研究中心教授.博士生导师,法学博士.先后在<法制与社会发展><法商研究>等中 ...

  • 动点问题:函数图象,及规律探索

    [方法技巧] 动点问题中函数图象的题目的解决方法是: 先根据动点运动规律找出所求与动点运动之间的关系,进而获取相应函数的解析式及函数值变化规律,达到求解的目的. 考查的重点是分段函数解析式的求解. 探 ...

  • 动点问题:函数图象及规律探索

    [方法技巧] 动点问题中函数图象的题目的解决方法是: 先根据动点运动规律找出所求与动点运动之间的关系,进而获取相应函数的解析式及函数值变化规律,达到求解的目的. 考查的重点是分段函数解析式的求解. 探 ...