单指令多数据流(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. Android实用的Toast工具类封装

    Toast这个提示框大家都晓得,显示一段时间后自动消失,不能获得焦点.但是在使用中有些问题: 1)需要弹出一个新的Toast时,上一个Toast还没有显示完2)可能重复弹出相同的信息3)Toast具体 ...

  2. linux epoll,poll,select

    epoll函数用法,还有点poll和select 1,LT的epoll是select和poll函数的改进版. 特点是,读完缓冲区后,如果缓冲区还有内容的话,epoll_wait函数还会返回,直到把缓冲 ...

  3. Python从零开始——迭代器与生成器

    一:迭代器 二:生成器

  4. 使用git的几个常用指令

    1. 移除git:rm -rf .git/ 2.查看结果:ls -al 3.语法糖(查看列表):ll 4.将远程库的内容,更新到本地:git pull origin master: 5.添加到本地仓库 ...

  5. 精通awk系列

    安装新版本gawk awk有很多种版本,例如nawk.gawk.gawk是GNU awk,它的功能很丰富. 本教程采用的是gawk 4.2.0版本,4.2.0版本的gawk是一个比较大的改版,新支持的 ...

  6. TCP数据的传输过程(十)

    建立连接后,两台主机就可以相互传输数据了.如下图所示: 上图给出了主机A分2次(分2个数据包)向主机B传递200字节的过程.首先,主机A通过1个数据包发送100个字节的数据,数据包的 Seq 号设置为 ...

  7. Python进阶-XIII 导入模块和包 异常处理

    一.模块的导入 1).import # 测试一:money与my_module.money不冲突 import my_module money=10 print(my_module.money) '' ...

  8. Pyppeteer

    pyppeteer模块的基本使用 引言 Selenium 在被使用的时候有个麻烦事,就是环境的相关配置,得安装好相关浏览器,比如 Chrome.Firefox 等等,然后还要到官方网站去下载对应的驱动 ...

  9. [LeetCode] 36. Valid Sudoku 验证数独

    Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to th ...

  10. GreenPlum 大数据平台--增加segment

    01,增加机器的配置 需要增加的机器安装greenplum 软件(操作见greenplum安装部署章节) 02,分配机器存储区域 03,配置互信 使用gpssh-exkeys确保Segment主机能通 ...