【发布时间】:2012-06-25 13:42:31
【问题描述】:
随着标题的推进,我们希望获得一些关于可用于具有以下约束的模式匹配的最快算法的建议:
长字典:256
短但不固定长度的规则(从 1 到 3 或最多 4 字节深度)
少量 (150) 条规则(如果 3 字节)或中等 (~1K) 如果 4
比 Snort 中使用的当前 AC-DFA 或 Snort 再次使用的 AC-DFA-Split 性能更好
基于软件(最近的 COTS 系统,如 E3 或 E5) 理想情况下希望使用一些 SIMD / SSE 的东西,因为目前它们是 128 位宽,并且在不久的将来它们将是 256 位,而 CPU 的 64 位
我们通过使用 Sigmatch 论文中显示的算法对 Snort AC 进行预过滤来开始这个项目,但遗憾的是结果并没有那么令人印象深刻(使用 GCC 编译时提高了约 12%,但使用 ICC 则没有)
之后我们尝试通过 IPP 库利用 SSE 4.2 中存在的新模式匹配功能,但根本没有性能提升(猜测直接在机器代码中执行会更好,但肯定会更复杂)
所以回到最初的想法。现在我们正在沿着 Head Body Segmentation AC 的路线工作,但我们知道除非我们替换建议的用于头部的 AC-DFA,否则很难获得改进的性能,但至少能够支持更多的规则而无需性能显着下降
我们知道使用位并行的想法会为长模式使用大量内存,但问题范围已减少到最多 3 或 4 个字节,因此使其成为可行的替代方案
我们特别找到了 Nedtries,但想知道你们的想法或是否有更好的选择
理想情况下,源代码应使用 C 语言并在开源许可下。
恕我直言,我们的想法是搜索一次移动 1 个字节的内容以处理不同的大小,但通过利用 SIMD / SSE 可能实现的大多数并行性并尝试减少分支,从而非常有效地做到这一点可能
我不知道这样做是明智的还是字节明智的
回到正确的键盘:D
本质上,大多数算法都没有正确利用当前的硬件功能或限制。它们非常缺乏缓存,非常分支,更不用说它们没有利用 COTS CPU 中现在存在的功能,这些功能允许您拥有一定程度的并行性(SIMD、SSE、...)
这正是我们正在寻找的,一种能正确考虑所有这些的算法(或现有算法的实现),其优点是不试图覆盖所有规则长度,只是较短的
例如,我看到一些关于 NFA 的论文声称,由于适当的缓存效率、增强的并行性等原因,现在它们的性能可以与内存需求少得多的 DFA 相提并论
【问题讨论】:
-
嗨,巴克斯特,感谢您的及时回复。我会尽快阅读它们,但只是快速浏览第一个似乎目标长度不太小(在论文 m 值中),这不是我们的情况(m = 1)。这是所有开窗或跳过算法的问题,我们的最小长度值太短,扼杀了它们的超线性性能
-
抱歉双重评论。顺便说一句,当我说超线性时,我的意思是亚线性:)
-
您可以删除重复的评论。我理解亚线性:-}
标签: algorithm pattern-matching