单指令多数据流(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相关支持还在研发中

最新文章

  1. CSS实现背景透明,文字不透明(兼容各浏览器)
  2. [MacOS] 终端使用ssh时,中文乱码问题处理
  3. C++ 笔记(一) —— 尽量以 const、enum、inline 替换 #define
  4. bootstrap加深
  5. Asp.net Identity 2.0 作弊条
  6. laravel md5+salt 密码
  7. Unity3D-Baked Lightmapping 示例学习
  8. 在WWDC 2014上,没提到的iOS 8 八大新特性
  9. 数据挖掘十大经典算法(5) 最大期望(EM)算法
  10. HTML5与APP的交互
  11. wdcp升级php和mysql
  12. Swift - 委托(delegate)的介绍,及使用样例
  13. PRINCE2学习
  14. Xgboost GPU 加速
  15. 本地计算机上的 postgresql 服务启动后停止解决方法
  16. SpringBoot整合StringData JPA
  17. 《JavaWeb从入门到精通》(明日科技,清华大学出版社)
  18. Activity,Fragment的状态保存
  19. HDU 2077 汉诺塔IV (递推)
  20. AJPFX简评:MT5平台

热门文章

  1. SqlServer数据库之给表添加序号
  2. Jmeter在chrome浏览器中录制脚本
  3. Java基础回顾一
  4. 网络编程socket模块subprocess模块 粘包的解决
  5. Linux命令——trap
  6. 曹玉中-201871010105《面向对象程序设计(java)》第6-7周学习总结
  7. 201871010124王生涛第六七周JAVA学习总结
  8. 开放接口的安全验证方案(AES+RSA)
  9. vscode使用插件来添加文件说明和函数说明——42header——psioniq File Header——koroFileHeader
  10. JDOJ 1770 埃及分数