之前写过jhyperscan性能优化过程_hyperscan java-CSDN博客,发现在libhs.so中针对同一个函数hs_scan会产生avx512_hs_scan, core2_hs_scan, corei7_hs_scan等符号;之前没有深究,近来得空,深入的走读了一遍其编译过程;
其主要过程分为两个部分,首先通过使用-march=core-avx2、corei7、core2对源码分别进行编译;正常编译尽管使用了不同的编译选项,符号是不会发生改变的;比如hs_scan函数编译之后,在.o文件中的符合还是hs_scan, hyperscan为了在编译过程中各个指令集的符号能够并存;使用了符号重命名的方法;使用objectcopy --redefine-syms对符号进行了重命名;比如在-march=core-avx2编译选项下编译的函数hs_scan的符号,修改为avx512_hs_scan函数;如此对于同一个源文件runtime.c被编译了三遍,生成了三个runtime.o,同时产生了avx512_hs_scan,corei7_hs_scan, core2_hs_scan三个符号;链接时将这三个runtime.o,都进行链接;但是对外提供服务的函数名还是hs_scan;此处,hyperscan,通过宏定义,增加了一个hs_scan的函数,而后通过运行机器所支持的指令集,以avx512、corei7、core2的顺序进行匹配,谁匹配到了,就使用该指令集对应的符号进行运行;实际实现的过程中,采用了函数指针的方式进行返回处理。
示意简图如下:

此外,hyperscan针对arm进行的适配也是通过上述类似的方法进行实现的;只是编译选项使用了使用arm指令集的方式,进行处理;对应的编译参数分别为-march=armv8-a、armv8-a+sve、armv8-a+sve+sve2-bitperm

3759

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



