如果可用,gcc是否使用Intel的SSE 4.2指令进行文本处理?

10

我在这里读到,英特尔推出了用于加速字符串处理的SSE 4.2 指令集

引用文章内容:

SSE 4.2指令集最初是在Intel Core i7中实现的,提供了用于处理字符数据的字符串和文本处理指令(STTNI),利用SIMD运算。虽然最初是为了加速字符串、文本和XML处理而设计的,但这些指令的强大新功能在这些领域之外也很有用,并且值得重新考虑许多应用程序的搜索和识别阶段,以利用STTNI来提高性能。

  • 如果可用,gcc是否使用这些指令?
  • 如果使用了,是哪个版本?
  • 如果没有使用,是否有任何开源库可以提供此功能?

2
我怀疑GCC能否自动识别特定任务作为测试处理,并使用它们。但如果编译器使用SSE4.2来执行strcpy()等函数,我也不会感到惊讶。 - Mysticial
@Mysticial 我想我指的是 strcpy 等函数,但更重要的是 atoi 等函数,以及它们的 C++11 等效函数 std::stoi 等。 - Steve Lorimer
1
你需要告诉gcc。库已经编译完毕,因此只有你的代码会受到影响,除非你也重新编译这些库。 - imel96
man gcc 中,我看到它默认在 x86-64 上使用 -mfpmath=sse,这启用了 SSE/SSE2。由此推断,我需要添加 -msse4.2,你同意吗? - Steve Lorimer
@lori 我从来没有依赖于编译器向量化,所以我不能确定它是否会真正实现。但至少 -msse4.2 将启用 SSE4.2 内置头文件以及编译器支持的任何 SSE4.2 优化。 - Mysticial
@lori 看起来 gcc 支持打包比较指令 http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011Update/compiler_c/intref_cls/common/intref_sse42_comp.htm 通过 smmintrin.h。 - Shafik Yaghmour
2个回答

4
关于软件库,我建议查看Agner Fog的asmlib。它包括许多例程,包括使用SSE4.2优化的几个字符串操作函数。它还提供一些其他有用的功能,例如返回有关每个级别的缓存大小以及支持哪些扩展名(例如SSE4.2)的CPU信息。 http://www.agner.org/optimize/asmlib.zip 要在GCC中启用SSE4.2,请使用-msse4.2进行编译,或者如果您的处理器具有AVX,则使用-mavx。

glibc 对手写汇编进行运行时调度;您不需要 -msse4.2 来使用 SSE4.2 版本或 strstr。SSE4.2 指令对于 strcmpstrchr 或其他简单函数并不更快。SSE4.2 字符串指令比 memcmp 的 SSE2 快多少? - 它们并不更快。 - Peter Cordes

3
我不确定gcc是否使用它,但通常文本处理是通过glibc完成的,所以这并不重要。如果您使用string.h中的标准字符串函数(可能cstring也可以),并且具有合理的glibc,则应自动使用它们。
我已经搜索过了,似乎glibc 2.15(甚至更早版本)已经具有SSE4.2 strcasecmp优化。

http://upstream.rosalinux.ru/changelogs/glibc/2.15/changelog.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接