使用Mono.Simd SSE指令进行流量控制

时间:2013-09-11 19:57:00

标签: c# .net mono sse

有没有人如何使用Mono.Simd命名空间来控制流程。例如,如果向量中的所有元素相对于另一个向量匹配某些条件,则中断。 e.g。

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 个答案:

答案 0 :(得分:2)

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>