写点什么

.NET 中的 SIMD

  • 2014 年 4 月 11 日
  • 本文字数:1266 字

    阅读完需:约 4 分钟

在 Mono 六年之后,微软的 CLR 实现最终通过 RyuJIT 提供了对 SIMD 的支持。RyuJIT 目前仍处在社区预览阶段,它是下一代的.NET JIT 编译器。

SIMD 代表的是单指令流多数据流(Single Instruction,Multiple Data)。它是一组特殊的 CPU 指令集,其中的指令可以对包含在大小为 2、4、8 或 16 的数组中的每个元素同时执行同一操作。在 2008 年 Mono 宣布对 SIMD 的支持时,我们曾报道过。

性能收益非常显著。执行 Spring-Gravity 算法,原生 C++ 程序用了 9.5 秒。比较而言,将其逐行转换到 Mono 中,执行用了 17.7 秒。而再将其从标准操作符转换为 SIMD 函数,运行 Mono 的时间下降到 1.7 秒。

很明显这种特性可以应用于游戏物理引擎和科学研究中,还可以应用于在一系列股票和基金上执行同样计算的金融应用中。

在.NET 中开启 SIMD,不仅需要安装 RyuJIT 并使用正确的向量类型。微软的 Kevin Frei 列出了一些步骤:

  1. 下载并安装 RyuJIT CTP3 (同以前一样,需要 x64 Windows 8.1 或 Window Server 2012R2)
  2. 设置“use RyuJIT”环境变量:set COMPLUS_AltJit=*
  3. 现在请注意,下面和以前有点区别了:
  4. 设置一个新的(而且是临时的)“enable SIMD stuff”环境变量:set COMPLUS_FeatureSIMD=1
  5. 把 Microsoft.Bcl.Simd NuGet 包添加到你的项目中(必须选择“include Prerelease”或使用–Pre 选项)
  6. 在 RyuJIT 最终配置好之前还有一些必须处理的麻烦事:对于你编写的会使用新的 Vector 类型的方法,请将一个对 Microsoft.Numerics.Vectors.Vector的引用添加到会在该方法调用之前调用的某个类的构造器中。我建议就把它放在你的程序的入口类的类构造器中。它必须出现在类的构造器,而不是实例构造器中。
  7. 确保应用确实运行在 x64 上。如果没有看到你的进程中加载了 protojit.dll(通过 tasklist /M protojit.dll 查看),那应该是遗漏了上面的某些东西。

应该注意的是,可用的 SIMD 不止一类。Kevin 写道,

对那些想直接尝试这一特性的人而言,我们可以快速地看一个细节:在 AVX 代码应该会比 SSE2 更好的硬件上,我们打算(而且我们已经开发了原型)让 Vector自动使用 AVX SIMD 类型。然而要想正确处理,还需要对.NET 运行时做些修改。因为这一限制(时间也不允许),CTP 版本只能支持 SSE2。

RyuJIT 本身主要是为改进应用在 64 位机器上的启动时间而设计的。以前微软假定消费者使用的是 x86,而 x64 仅被用于运行服务器的 IT 部门手中,所以启动时间并不是很严重的问题。这使他们可以选择面向 x86 的快速 JIT 编译器,面向 x64 的则是慢一些、但更高效的 JIT 编译器。快进了大约十年,情况已经发生了变化。

2013 年 9 月的.NET 框架博客上曾经介绍:

.NET 代码生成团队一直在为一个新的下一代 x64 编译器而努力工作,该编译器代号为 RyuJIT。这一新的 JIT 编译器是原来的两倍快,使用它编译的应用,启动时间最多可以减少 30%(花在 JIT 编译器上的时间只是启动时间的一部分,所以应用启动时间并不会随着 JIT 性能加倍而减半)。此外,新的 JIT 编译器仍然会生成极好的代码,可以在服务器进程长期运行的过程中高效执行。

查看英文原文: SIMD Support in .NET

2014 年 4 月 11 日 21:391690
用户头像
臧秀涛 略懂技术的运营同学。

发布了 300 篇内容, 共 121.0 次阅读, 收获喜欢 30 次。

关注

评论

发布
暂无评论
发现更多内容

java开发之Redis的使用规范

@零度

redis JAVA开发

2022年企业数字化技术应用10大趋势

易观分析

银行数字化转型 企业数字化 后疫情时代企业应对策略 十四五规划

TDSQL | 将企业级分布式数据库做到极致

腾讯云数据库

tdsql 国产数据库

虎符研究院深入解读Web3.0未来趋势 盘点代表性项目

区块链前沿News

Web Hoo虎符 虎符研究院 虎符平台 3.0

前端使用 zx 库在 Node 中编写 Shell 脚本

devpoint

node.js Shell 1月月更 zx.js

我相信:没有解不开的难题|ONES 人物

万事ONES

龙蜥社区一周动态 | 1.10-1.14

OpenAnolis小助手

Linux 开源 社群

CSS 自适应内容宽度的输入框

编程江湖

使用php-amqplib实现RabbitMq

Owen Zhang

php RabbitMQ php-amqplib

大数据开发之通过 Spark 来扩展 Presto

@零度

大数据 spark

Chrome插件:摸鱼倒计时、每日摸鱼时间统计,奋斗逼、卷王必备,用于减少摸鱼时间和频率

OBKoro1

效率 开源 效率工具 chrome扩展 高效率

Linux之diff命令

入门小站

Linux

ReactNative进阶(二十三):Javascript 严格模式详解

No Silver Bullet

React Native 1月月更

Jetpack—LiveData组件的缺陷以及应对策略

vivo互联网技术

android livedata JetPack 移动应用开发

GIS :元宇宙未来发展的有力技术支撑

华为云开发者社区

AI GIS 虚拟世界 数字孪生 云宇宙

TDSQL-C for PostgreSQL 主从架构详解

腾讯云数据库

tdsql 国产数据库

创业老兵李峻的新征程|ONES 人物

万事ONES

线上流量对比应用实践

得物技术

数据 流量 实践 #架构 流量回放

ONES CTO 冯斌|如何低成本地做出高质量决策

万事ONES

前端开发之JQuery的综合应用

@零度

jquery 前端开发

知识库进化论 | 华创资本对话 ONES & 为知笔记创始人

万事ONES

Android技术分享| 自定义View实现使用更方便的SeekBar

anyRTC开发者

android 音视频 移动开发 白板 SeekBar

Hadoop小文件问题产生及解决方案

五分钟学大数据

hadoop 1月月更

Java正则表达式语法大全

编程江湖

TDSQL PG版企业级分布式数据库技术创新实践

腾讯云数据库

tdsql 国产数据库

2021 OceanBase 开源半年度报告 | 不忘初心,感恩同行

OceanBase 数据库

开发者 报告 OceanBase 开源 OceanBase 社区版

组件通信、硬件池化,这些创新技术你get了吗?|HDC2021技术分论坛

HarmonyOS开发者社区

HarmonyOS

Serverless 背景下,一部分“前端工程师”会转变为“应用交付工程师”

杨成功

Serverless 前端 #架构

我以订披萨为例,给女朋友详细讲了Java设计模式的3种工厂模式

华为云开发者社区

Java 工厂模式 工厂方法模式 简单工厂模式 抽象工厂模式

MySQL分区表简介

soap said

:MySQL 数据库

Hive SQL底层执行原理

五分钟学大数据

Hive SQL 1月月更

.NET中的SIMD_.NET_Jonathan Allen_InfoQ精选文章