使用 Mono.Simd SSE 指令进行流控制
Posted
技术标签:
【中文标题】使用 Mono.Simd SSE 指令进行流控制【英文标题】:Flow Control with Mono.Simd SSE instructions 【发布时间】:2013-09-11 19:56:59 【问题描述】:有谁知道如何使用 Mono.Simd 命名空间进行控制流。例如,如果一个向量中的所有元素都与另一个向量相关的某个条件匹配,则中断。例如
var y= Vector2d(1,2);
var x=Vector2d(3,4):
if(y<x)//compare less than, true for both???
//Do something…
我收集 SSE 有一个有用的 movmskps 指令,并且有比较功能,但它们会创建位掩码,我不确定如何/如何最好地与 C# 一起使用。
【问题讨论】:
【参考方案1】:Mono 提供了一个名为 ExtractByteMask
的包装器,您可以将其用于此目的。请注意,您应该尽可能避免流量控制。
var y = new Vector2d(1,2);
var x = new Vector2d(3,4);
if (VectorOperations.ExtractByteMask((Vector16sb)VectorOperations.CompareLessThan(y, x)) == 0xffff)
Console.WriteLine("All components passed the comparison");
如果你有兴趣,这里是一段生成的代码:
1062: 66 0f c2 c1 01 cmpltpd %xmm1,%xmm0
1067: 66 0f d7 c0 pmovmskb %xmm0,%eax
106b: 3d ff ff 00 00 cmp $0xffff,%eax
1070: 75 0c jne 107e <Sample_Main+0x5e>
【讨论】:
以上是关于使用 Mono.Simd SSE 指令进行流控制的主要内容,如果未能解决你的问题,请参考以下文章