单指令多数据流(SIMD)是CPU基本运算之外为了提高并行处理多条数据效率的技术,常用于多媒体处理如视频,3D模拟的计算。实现方式不同品牌的CPU各有自己的指令集,如SSE MMX 3DNOW等。

C#开发.net core软件的过程中也可以让编译器自动采用这些SIMD指令集进行代码优化,测试了一下在我的AMD 锐龙7 2700X上对于整数加法处理可以提高10倍的效率。

下面是我自己写的例子:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using System.Diagnostics;
using System.Text;
using System.Threading.Tasks; namespace MySIMDTest
{
class Program
{
static Random rand = new Random();
static Vector<int> getVec32(int count)
{
var lst = new List<int>(count);
for (int i = 0; i < count; ++i) lst.Add(rand.Next(100));
return new Vector<int>(lst.ToArray());
} static Vector<short> getVec16(int count)
{
var lst = new List<int>(count);
for (int i = 0; i < count; ++i) lst.Add(rand.Next(100));
return new Vector<short>(lst.Select(i => (short)i).ToArray());
} static void Main(string[] args)
{
var sw = new Stopwatch();
var testTimes = (int)(Math.Pow(10, 5));
var vecSize = (int)(Math.Pow(10, 2)); Action testNormal = () =>
{
Console.Write("normal test ");
var lstVecN1 = new List<Vector<int>>();
var lstVecN2 = new List<Vector<int>>();
for (int i = 0; i < testTimes; ++i)
{
lstVecN1.Add(getVec32(vecSize));
lstVecN2.Add(getVec32(vecSize));
} sw.Restart();
for (int i = 0; i < testTimes; ++i)
{
for(int j = 0; j < vecSize; ++j)
{
var r = lstVecN1[i] + lstVecN2[i];
}
}
sw.Stop();
Console.WriteLine(sw.Elapsed);
}; Action test16 = () =>
{
Console.Write("16 test");
var lstVecA1 = new List<Vector<short>>();
var lstVecA2 = new List<Vector<short>>();
for (int i = 0; i < testTimes; ++i)
{
lstVecA1.Add(getVec16(vecSize));
lstVecA2.Add(getVec16(vecSize));
} sw.Restart();
for (int i = 0; i < testTimes; ++i)
{
var result1 = lstVecA1[i] + lstVecA2[i];
}
sw.Stop();
Console.WriteLine(sw.Elapsed);
}; Action test32 = () =>
{
Console.Write("32 test");
var lstVecB1 = new List<Vector<int>>();
var lstVecB2 = new List<Vector<int>>();
for (int i = 0; i < testTimes; ++i)
{
lstVecB1.Add(getVec32(vecSize));
lstVecB2.Add(getVec32(vecSize));
} sw.Restart();
for (int i = 0; i < testTimes; ++i)
{
var result1 = lstVecB1[i] + lstVecB2[i];
}
sw.Stop();
Console.WriteLine(sw.Elapsed);
}; for (int i = 0; i < 8; ++i) testNormal();
for (int i = 0; i < 8; ++i) test32();
for (int i = 0; i < 8; ++i) test16();
Console.ReadKey();
}
}
}

运行结果:

只要用Vector<T>支持的重载运算符来代替数组或者列表之类进行计算,即可获得编译器SIMD自动优化指令的效果。不过目前文档里说只支持x86系列的CPU ARM的CPU相关支持还在研发中

.net core SIMD范例分析的更多相关文章

  1. 一个由正则表达式引发的血案 vs2017使用rdlc实现批量打印 vs2017使用rdlc [asp.net core 源码分析] 01 - Session SignalR sql for xml path用法 MemCahe C# 操作Excel图形——绘制、读取、隐藏、删除图形 IOC,DIP,DI,IoC容器

    1. 血案由来 近期我在为Lazada卖家中心做一个自助注册的项目,其中的shop name校验规则较为复杂,要求:1. 英文字母大小写2. 数字3. 越南文4. 一些特殊字符,如“&”,“- ...

  2. ASP.NET Core[源码分析篇] - WebHost

    _configureServicesDelegates的承接 在[ASP.NET Core[源码分析篇] - Startup]这篇文章中,我们得知了目前为止(UseStartup),所有的动作都是在_ ...

  3. ASP.NET Core[源码分析篇] - Authentication认证

    原文:ASP.NET Core[源码分析篇] - Authentication认证 追本溯源,从使用开始 首先看一下我们通常是如何使用微软自带的认证,一般在Startup里面配置我们所需的依赖认证服务 ...

  4. DOTNET CORE源码分析之IOC容器结果获取内容补充

    补充一下ServiceProvider的内容 可能上一篇文章DOTNET CORE源码分析之IServiceProvider.ServiceProvider.IServiceProviderEngin ...

  5. ASP.NET CORE MVC用时分析工具MiniProfiler

    ASP.NET CORE MVC用时分析工具MiniProfiler MiniProfiler(https://miniprofiler.com/)是一个轻量级且简单易用的分析工具库,它可以用来分析A ...

  6. 使用GDB 追踪依赖poco的so程序,core dump文件分析.

    前言 在windows 下 系统核心态程序蓝屏,会产生dump文件. 用户级程序在设置后,程序崩溃也会产生dump文件.以方便开发者用windbg进行分析. so,linux 系统也有一套这样的东东- ...

  7. [asp.net core 源码分析] 01 - Session

    1.Session文档介绍 毋庸置疑学习.Net core最好的方法之一就是学习微软.Net core的官方文档:https://docs.microsoft.com/zh-cn/aspnet/cor ...

  8. AIX下core文件的分析

    笔者曾在AIX系统下使用C语言开发多个应用系统.众所周知,C语言编写程序时容易出现内存使用不当的BUG,例如内存越界.使用野指针.内存未初始化等等.在程序运行时,这些BUG很可能造成程序崩溃,但在测试 ...

  9. core dump文件分析和调试

    core介绍 当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成"核心转储").我们可以认 ...

随机推荐

  1. RHEL7.5 静默安装(silent mode)oracle11gr2数据库软件

    如果没有图形界面多可怕,或者图形界面安装总报些奇怪的错误多可怕,静默安装数据库软件了解一下 修改主机名.关闭selinux [root@localhost ~]$ sed -i '3,$d' /etc ...

  2. 3-14 Pandas绘图

      1.魔法指令:%matplotlib inline :数据画图 In [1]: %matplotlib inline import pandas as pd In [2]: import nump ...

  3. centos7 安装gitlab及简单配置

    1.安装 wget -O gitlab.rpm https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-11.11.3 ...

  4. CF704D Captain America(上下界网络流)

    传送门 题意: 二维平面给出\(n\)个点,现在可以给每个点进行染色,染红色的代价为\(r\),染蓝色的代价为\(b\). 之后会有\(m\)个限制,形式如:\(t_i\ l_i\ d_i\),当\( ...

  5. 201871010132-张潇潇-《面向对象程序设计(java)》第七周总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  6. Linux环境下sudo切换用户后执行其他命令

    https://blog.csdn.net/liangxw1/article/details/80106465

  7. Nginx 环境搭建 (windows)

    Nginx 环境搭建 (windows) 资源 # nginx在线文档和支持 For online documentation and support please refer to nginx.or ...

  8. pointnet++的pytorch实现

    代码参考:https://blog.csdn.net/weixin_39373480/article/details/88934146 def recognize_all_data(test_area ...

  9. 3.Vue的基本语法

    1.v-bind 可简写为":" 你看到的 v-bind 等被称为指令.指令带有前缀 v-,以表示它们是 Vue 提供的特殊特性. 我们可以使用 v-bind 来绑定元素特性! 在 ...

  10. vector的基本操作

    vector怎么删除元素? #include<iostream> #include<vector> using namespace std; int main() { vect ...