使用 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 指令进行流控制的主要内容,如果未能解决你的问题,请参考以下文章

SIMT 和 SIMD 中的控制流发散

AWS:无法使用流从 SSE-KMS 加密存储桶下载文件

我是否必须在控制流图中考虑预处理程序指令?

控制流指令

Heroku 上的 Sinatra/Thin 未检测到 HTTP 流连接 (SSE) 客户端断开连接

20145207《信息安全系统设计基础》第十一周学习总结