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

本文关键字:流量控制 指令 SSE Mono Simd 使用 | 更新日期: 2023-09-27 18:31:02

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

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

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>