单指令多数据流(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. jQuery中$符号的作用

    jQuery中$符号的作用 1.查找作为jQuery包装器,利用选择器来选择DOM元素(这个也是最强大的功能) 例如:$("table tr:nth-child(even)") 基 ...

  2. HBase常用的JAVA API操作

    为了方便以后查看,总结了一些常用的java操作hbase的代码: package com.mcq; import static org.hamcrest.CoreMatchers.describedA ...

  3. Transformer模型---encoder

    一.简介 论文链接:<Attention is all you need> 由google团队在2017年发表于NIPS,Transformer 是一种新的.基于 attention 机制 ...

  4. c# 第11节 运算符大全

    本节内容: 1:数学运算符 2:赋值运算符 3:关系运算符 4:布尔运算符 5:位运算符 6:其他运算符 1:数学运算符 2:赋值运算符 3:关系运算符 4:布尔运算符 5:位运算符 & 运算 ...

  5. python中判断两个对象是否相等

    #coding=utf-8#比较两个对象是否相等#python 2中使用cmp(),==,is#is 主要是判断 2 个变量是否引用的是同一个对象,如果是的话,则返回 true,否则返回 false. ...

  6. CentOS 8 正式发布!

    CentOS 8 正式发布! CentOS 8 和 RedHat Enterprise Linux 8 发行的版本是一致的,都是基于 Fedora 28 和 内核 4.18.支持传统的.新兴的工作负载 ...

  7. 7 Exciting Uses of Machine Learning in FinTech

    https://rubygarage.org/blog/machine-learning-in-fintech Machine learning (ML) has moved from the per ...

  8. LG5357 「模板」AC自动机(二次加强版) AC自动机+fail树

    问题描述 LG5357 题解 不是fail树的AC自动机复杂度是假的. 把AC自动机搞出来,建立Trie树,树上爆搜一遍就好了. \(\mathrm{Code}\) #include<bits/ ...

  9. 论文阅读笔记六十一:Selective Kernel Networks(SKNet CVPR2019)

    论文原址:https://arxiv.org/pdf/1903.06586.pdf github: https://github.com/implus/SKNet 摘要 在标准的卷积网络中,每层网络中 ...

  10. 两台三层交换机单区域OSPF动态路由实验

    一.   实验目的 1.  掌握三层交换机之间通过OSPF协议实现网段互通的配置方法. 2.  理解RIP协议和OSPF协议内部实现的不同点 二.   应用环境 当两台三层交换机级联时,为了保证每台交 ...