【发布时间】:2019-04-19 21:55:54
【问题描述】:
在 .NET Core 上的 C# 中,我正在寻找最快的方法来检查给定的 ushort 值是否存在于 Span<ushort> 范围内。天真的选项包括枚举跨度,但我强烈怀疑通过 SIMD(即 SSE 或 AVX)存在更快的单核选项。
这里最快的选择是什么? (不安全的代码是可以的)
【问题讨论】:
-
你能用其他结构吗,比如
Hashset<ushort>? -
是的,SSE2 有
pcmpeqw,它允许您在线性搜索中一次检查 16 个字节。您可以像实现矢量化memchr循环一样使用它(使用pmovmskb获得整数结果)。 AVX2 具有相同指令的 32 字节版本。各种可能的优化包括在分支之前检查整个缓存行(将 pcmpeq 结果与 OR 结合)。我不知道 C#,但大概这是手动矢量化的一个很好的起点,如果你的编译器/运行时没有为你自动矢量化,即使你到达对齐边界等。 -
determine if a word has a byte equal to n 有个窍门,但可能不会比 SIMD 快
标签: c# performance .net-core simd