有没有人如何使用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#。
答案 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>