博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
验证 .NET 4.6 的 SIMD 硬件加速支持的重要性
阅读量:7021 次
发布时间:2019-06-28

本文共 2365 字,大约阅读时间需要 7 分钟。

SIMD 的意思是 Single Instruction Multiple Data。顾名思义,一个指令可以处理多个数据。

.NET Framework 4.6 推出的 Nuget 程序包 System.Numerics.Vectors 里面的 Vector`1 类型是有硬件加速功能的。这个硬件加速功能就是指即时编译的时候根据硬件环境选用一些 SIMD 的指令让程序运行更快。

这个硬件加速功能的威力可以用下面的方式得到验证。

用单线程的程序重复 10000000H 个单精度浮点数的加法。加法的每一个输入都是引用类型,输出也必须获取值的引用。

VB 2017 程序:

动态获取当前硬件支持一组算多少个单精度浮点数的加法,然后分组计算。Release x64 编译,优化代码(反编译验证没有优化掉循环),取消整数溢出检查(为了跟 c# 执行时间一样)。

VB

Imports System.NumericsModule Program    Sub Main()        Const TotalDataSize = &H1000_0000        Dim watch As New Stopwatch        Dim groupSize = Vector(Of Single).Count        Dim groupCount = TotalDataSize / groupSize        Console.WriteLine($"每组数据的大小:{groupSize} (1:不优化,4:SSE2 优化,8:AVX2 优化)一共要处理 {groupCount} 次数据以完成测试。")        Console.WriteLine("计时开始!")        watch.Start()        Dim groupA(groupSize - 1), groupB(groupSize - 1) As Single        Dim vecA As New Vector(Of Single)(groupA), vecB As New Vector(Of Single)(groupB), vecResult As Vector(Of Single)        For i = 1 To groupCount            vecResult = vecA + vecB        Next        watch.Stop()        Console.WriteLine($"计时结束。用时:{watch.ElapsedMilliseconds} 毫秒。")        Console.ReadKey()    End SubEnd Module

 

VC++ 2017程序:

用循环 0x10000000 次的 for 循环,Release x64 编译,禁止优化(开优化不管循环多少次都是 0 毫秒,肯定是把循环优化掉了)。

C++

#include "stdafx.h"#include 
#include "NotOptimizedNativeCodes.h"const int TotalDataSize = 0x10000000;#pragma unmanagedvoid NativeTest(){ float groupA[1] = { 0 }, groupB[1] = { 0 }, *groupResult; for (size_t i = 0; i < TotalDataSize; i++) { float result = groupA[0] + groupB[0]; groupResult = &result; }}#pragma managedusing namespace System;using namespace System::Diagnostics;int NotOptimizedNativeCodes::Program::main(array
^args){ auto watch = gcnew Stopwatch(); std::cout << "每组数据的大小:" << 1 << "(1:不优化,4:SSE2 优化,8:AVX2 优化)" << std::endl << "一共要处理" << TotalDataSize << " 次数据以完成测试。" << std::endl; Console::WriteLine(L"计时开始!"); watch->Start(); NativeTest(); watch->Stop(); std::cout << "计时结束。用时:" << watch->ElapsedMilliseconds << " 毫秒。" << std::endl; Console::ReadKey(); return 0;}int main(array
^args) { NotOptimizedNativeCodes::Program::main(args);}

 

执行结果(CPU 是 i5 6400,有 AVX2 指令集)

使用 i7 3632QM (没有 AVX2 但是有 SSE2)

转载于:https://www.cnblogs.com/Nukepayload2/p/simd_netfx46_nativecpp.html

你可能感兴趣的文章
[POJ1155]TELE(树形背包dp)
查看>>
查找表索引
查看>>
ctf--php
查看>>
leetcode921
查看>>
leetcode1003
查看>>
MYSQL的启动
查看>>
leetcode--589. N叉树的前序遍历 非递归实现
查看>>
AC自动机+高斯消元 hdu 5955 Guessing the Dice Roll 16沈阳icpc
查看>>
Visual2010解决方案单个项目的执行
查看>>
九九乘法表:使用"类名.方法名" 调用静态方法
查看>>
Linux命令学习笔记
查看>>
循环链表
查看>>
(一)mybatis简易搭建
查看>>
接口 与 抽象类
查看>>
写出好简历吧
查看>>
Android IOS WebRTC 音视频开发总结(七六)-- 探讨直播低延迟低流量的粉丝连麦技术...
查看>>
AC日记——[USACO1.1]坏掉的项链Broken Necklace 洛谷 P1203
查看>>
常用类的课后作业
查看>>
JAVA单例模式的几种实现方法
查看>>
Windows Azure Service Bus 推动财务服务门户的高可用性和可伸缩性
查看>>