图形硬件上的正则表达式匹配
1. 正则表达式匹配概述
为了减轻 CPU 的负担并提高整体性能,我们对 Snort 架构进行了扩展,使其能够利用 GPU 进行正则表达式匹配。当需要对数据包进行正则表达式扫描时,数据包会被传输到 GPU 上进行实际的匹配操作。GPU 的单程序多数据(SPMD)操作特性非常适合创建多个正则表达式状态机实例,这些实例可以在不同的流处理器上运行,并处理不同的数据。
由于数据传输到 GPU 会产生开销,将多个小的数据传输合并为一个大的数据传输会比单独进行每个传输的性能更好。因此,我们选择批量将数据包复制到 GPU。为此,我们使用一个单独的缓冲区来临时存储需要进行正则表达式匹配的数据包。每当缓冲区填满时,它就会被传输到 GPU 进行处理。
数据包缓冲区的格式如下:
| Reg.Ex. ID | Length | Payload |
| — | — | — |
| 4 | 0 | 6 |
| 1536 | - | - |
每个数据包及其需要匹配的正则表达式标识符都会存储在缓冲区中。由于每个数据包可能需要匹配不同的表达式,因此每个数据包都会被“标记”,以便在搜索阶段使用适当的正则表达式进行处理。缓冲区的每一行都包含一个特殊字段,用于存储指向对应正则表达式状态机的指针。
当缓冲区填满时,GPU 的所有流处理器会同时对其进行处理。匹配过程是一个内核函数,能够并行扫描每个网络数据包的有效负载以查找特定的表达式。这个内核函数由多个线程同时并行执行。每个线程使用正则表达式的标识符独立扫描整个数据包。所有正则表达式的状态机都存储在图形处理器的内存空间中,因此流处理器可以直接访问它们,并同时搜索数据
超级会员免费看
订阅专栏 解锁全文
16

被折叠的 条评论
为什么被折叠?



