.NET JIT编译器在什么条件下会执行自动向量化?

16

新的RyuJIT编译器是否会生成矢量(SIMD) CPU指令?如果会,何时生成?

副笔:System.Numerics命名空间包含的类型允许显式使用向量操作,具体是否生成SIMD指令取决于CPU、CLR版本、JITer版本、直接编译到本机代码与否等因素。本问题专门探讨非向量代码(例如C#或F#)何时会生成SIMD指令。

1个回答

14
RuyJIT中的SIMD代码生成严格限制于System.Numerics.Vectors命名空间中的类型。要实现通用SIMD支持需要对CLR进行非常重大的修订,只有当SIMD变量正确对齐时,这样的代码才能有效。SSE2至少需要16位对齐,AVX2需要32位对齐,即将推出的AVX-512需要64位对齐。
目前离这个目标还很遥远,32位CLR只能对齐到4,而64位版本只能对齐到8。这是响应32位和64位代码的“自然”对齐方式。所需的更改将影响CLR的每个部分,包括垃圾收集器和类加载器。目前没有关于考虑此类重大更改的热点话题,CoreCLR项目也没有明显的迹象表明已经考虑过这一点,因为它可能是最明显的目标版本。
如果要利用超出System.Numerics.Vectors当前支持范围的SIMD,则可以使用C++编译器,使用C++/CLI或C++/CX语言扩展进行互操作。

1
关于内存对齐,我在英特尔的评论中发现了这句话:“大多数使用VEX编码的SIMD数字和数据处理指令语义与具有内存操作数的指令相比,具有更宽松的内存对齐要求,而使用SIMD前缀编码的指令则不然。” [Intel® 64 and IA-32 Architectures Software Developer’s Manual] (http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-1-manual.pdf) - redcalx
2
“Can only be efficient”是关键短语。未对齐的加载和存储操作非常昂贵。 - Hans Passant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接