Tag: simd

使用SIMD内在函数时,这些额外的反汇编指令是什么?

我正在测试通过使用RyuJIT的SIMD指令可以得到什么样的加速,我看到一些我不期望的反汇编指令。 我将这段代码基于RyuJIT团队的Kevin Frei的博客文章以及相关post。 这是function: static void AddPointwiseSimd(float[] a, float[] b) { int simdLength = Vector.Count; int i = 0; for (i = 0; i < a.Length – simdLength; i += simdLength) { Vector va = new Vector(a, i); Vector vb = new Vector(b, i); va += vb; va.CopyTo(a, i); } } 我正在查询的反汇编部分将数组值复制到Vector 。 大多数反汇编与Kevin和Sasha的post类似,但我强调了一些额外的指令(以及我的混淆注释),这些指令没有出现在他们的反汇编中: ;// […]

RyuJIT没有充分利用SIMD内在函数

我正在运行一些使用System.Numerics.Vector C#代码,但据我所知,我没有得到SIMD内在函数的全部好处。 我正在使用Visual Studio Community 2015和Update 1,而我的clrjit.dll是v4.6.1063.1。 我正在使用英特尔酷睿i5-3337U处理器 ,它实现了AVX指令集扩展。 因此,我认为,我应该能够在256位寄存器上执行大多数SIMD指令。 例如,反汇编应该包含像vmovups , vmovupd , vaddups等的指令,以及Vector.Count应该返回8, Vector.Count应该是4等等……但那不是我的意思我看到了。 相反,我的反汇编包含诸如movups , movupd , addups等指令……以及以下代码: WriteLine($”{Vector.Count} bytes per operation”); WriteLine($”{Vector.Count} floats per operation”); WriteLine($”{Vector.Count} ints per operation”); WriteLine($”{Vector.Count} doubles per operation”); 生产: 16 bytes per operation 4 floats per operation 4 ints per operation 2 doubles per operation 我哪里错了? […]

用于检查字节数组是否为零的SSE指令C#

假设我有一个byte[]并想检查所有字节是否为零。 For循环是一种显而易见的方法,而LINQ All()是一种奇特的方式,但最高性能至关重要。 如何使用Mono.Simd来加速检查字节数组是否满了零? 我正在寻找最前沿的方法,而不仅仅是正确的解决方案。