当我们用C(或C++)编写时,我们可以使用内联汇编代码_asm
.这使我们能够优化程序中一小部分高度使用的部分,以利用汇编SIMD指令.大多数情况下我们不需要它,但是,例如,视频处理,加密/解密和数学算法将充分利用它们.在某些情况下,一些编译器(我确定gcc)甚至可以使用SIMD指令来处理普通代码,所以即使我们不知道它们的存在,我们也会使用它们.
从我天真的角度来看,在CIL中支持它们应该非常简单(在极少数情况下回退到软件实现它们不受支持).不同的故事是用C#公开它们(例如),但是对于这种专门的功能,即使一个msil
块(类似_asm
)也会很好用.
所以我的问题是:在ECMA 335中,我没有找到任何内容,但MSIL中的SIMD指令是否有任何(记录或未记录的)支持?
我不认为它们在JIT编译器生成的内容中使用,而是在我的.NET应用程序中明确使用它们的机制.当然,我可以用所有这些算法编写C++/CLI程序集,只需在我的.NET应用程序中使用它们,但我会避免使用混合模式程序集来保持应用程序完全可验证(并且不为不同的体系结构提供不同的程序集).
即使是最肮脏的技巧也是受欢迎的,因为它必须在很少的专门功能中使用.
我知道存在支持Microsoft SIMD的矢量类型,它们是一件好事但是(1)我不是在寻找外部库而且我绝对不想部署测试版JIT,(2)他们仅针对Windows 8 64位,(3)到目前为止,SIMD支持非常小(如果我需要这个,那么我希望它全部,脏和快).
我担心CIL级别没什么.
正如您所指出的,Microsoft正在向未来版本的.NET提供SIMD支持.
如果你可以使用Mono,它有一段时间的SIMD支持(目前与Microsoft.Bcl.Simd API不兼容).
.NET和Mono都有一个共同的方法,JIT内在函数与标准的IL实现.