Glibc 删除了各种 SSSE3 优化的代码路径


最新的 GNU C Library (Glibc) 开发代码已经开始丢弃各种 SSSE3 优化代码路径。其中包括删除 mem{move| cpy }-ssse3-back、str{p}{n}cpy-ssse3、str{n}cat-ssse3、str{n}{case}cmp-ssse3 和 {w }memcmp-ssse3 代码路径。

根据介绍,Supplemental Streaming SIMD Extensions 3 (SSSE3) 可以追溯到十多年前的 Intel Xeon 5100 / Core 2 days 或 AMD Bobcat/Bulldozer,彼时的设想是作为 SSE 的一个迭代。但是由于 Glibc 也携带了与 SSSE3 差不多时间的旧版 SSE2 或 SSE4.1 的优化代码路径,加上用于较新的 Intel/AMD CPU 的 AVX2 和 EVEX 代码路径,SSSE3 代码路径正在被逐步淘汰。

考虑到 SSE2/SSE4.1/AVX2/EVEX 代码路径的存在,Glibc 开发人员认为不再值得提供 SSSE3 优化的代码路径;因为已经很少有 Intel/AMD CPU 留给 SSSE3 路径,且在代码中提供 SSSE3 支持需要的成本并不低。从上周开始,开发人员已经开始着手移除它。

围绕 memmove/mempcpy/memcpy 的 SSSE3 代码也有所减少。commit 内容解释称:

目标是删除大多数 SSSE3 function,因为 SSE4、AVX2 和 EVEX 通常更可取。memcpy/memmove 是一个例外,对于某些目标来说,用`palignr`避免无符号负载很重要。

此 commit 用一个更好的优化和更低的代码占用率的版本替换了 memmove-ssse3,同时它还将 memcpy 别名为 memmove。

除此之外,所有其他 SSSE3 functions 都应该可以安全删除。性能并没有发生太大变化,尽管显示了整体改进而没有任何重大的 regressions 或 gains。

bench-memcpy geometric_mean(N=50) New / Original: 0.957

bench-memcpy-random geometric_mean(N=50) New / Original: 0.912

bench-memcpy-large geometric_mean(N=50) New / Original: 0.892

Benchmarks where run on Zhaoxin [email protected]

完整的在 Zhaoxin [email protected] 上运行的基准测试结果可见附件。

更重要的是,此举在 memmove 中节省了 7246 个字节的代码大小,通过将 memmove 代码重新用于 memcpy 又节省了10741个字节(总共节省了  17987 个字节)。还有一个额外的 896 字节的 jump table entries 的rodata。

Glibc 2.36 版本正在逐步淘汰相关的 SSSE3 代码路径。 


相关文章

2022-10-22

素而异。 与此同时,今天在 Glibc git 中,Noah Goldstein 对各种 libc 函数的现有 EVEX 实现进行了许多优化。  

2023-02-02

现在支持--no-addrconfig选项。 动态链接器不再从库搜索路径上的“tls”子目录或与 AT_PLATFORM 系统名称对应的子目录加载共享对象。 CVE-2022-39046 的安全修复,当向 syslog 函数传递一个长度超过 1024 字节的特制输入字符串时,

2022-07-10

取,导致命令替换中损坏的多字节字符 composer 修复代码注入问题 [CVE-2022-24828];更新 GitHub 令牌模式 freetype 修复缓冲区溢出问题 [CVE-2022-27404];修复崩溃 [CVE-2022-27405 CVE-2022-27406] gnutls28 修复 SSSE3 SHA384 计算错误

2022-07-20

了 FreeBSD 上的构建失败,修复了使用更新的 Glibc 构建,删除了不推荐使用的项目,并且还放弃了 Qt 4 工具包支持, Qt4 自 2015 年以来一直不受支持,早就应该将其删除。 其他内容还包括 glibc 2.33 的编译修复、使用 Python 3 进行测

2022-10-19

c Exceptions/Errors 更新内置 Web 服务器的 MIME 类型表 减少各种函数返回的字符串的内存占用 新的 Random 扩展 为 Linux 启用 arc4random_buf 与 Glibc 2.36+ 随机字节 初步支持 ARM64 的 Windows 上的交叉构建 将 JIT 缓冲区 Opcache 分

2022-08-04

Glibc 是提供系统调用和基本函数的标准 C 语言库,目前 2.36 版本已经发布,主要内容如下: 添加了对 DT_RELR 相对重定位格式的支持,一个新的 ELF 动态标签。 在 Linux 上添加 pidfd_open、pidfd_getfd 和 pidfd_send_signal 函数。pidfd 功

2023-02-19

动重建数据库并重新迁移数据,不再需要手动去数据目录删除数据库 优化 微调了桌面歌词逐行字体阴影,使其看起来更匀称 调整了桌面歌词在启用滚动到顶部时的距离,现在滚动到顶部的歌词更靠边,不再受字体大小、

2022-09-30

化 优化多角色数据权限匹配规则 update dubbo 升级 3.1.0 删除自行处理的源码修复 采用官方修复后的代码 update 优化 页面内嵌iframe切换tab不刷新数据 update 优化 调整 oss表key 与 ossconfig的service 字段长度不匹配 update 优化

2023-03-20

用自定义代码路径,以根据运行时 CPU/功能优化性能。 删除了对 Armv2A / Armv2A / Armv3 / Armv3M 架构的支持。  LLVM 16 的 libc++ C++ 标准库增加了对更多 C++20 和 C++23 功能的支持。 更多内容可以查看 LLVM 16 的 Release Notes,可从此

2022-11-28

72)05673e6 恢复场景检查2752356 使用新证书。e9da157 增强删除列表解析5118724 支持-delete registry:NAME从 system registry 中删除图像fe5eeb8 字符串优化d78b958 允许 EOFd0bee0b 使用新的私有 api。2d0b7fc 重命名变量fa28e60 将 HLS 旋转 120

2022-12-21

well CPU 的 glibc 回归修复 Linux 5.10 内核构建的更新 由于各种安全漏洞而发布的新 NVIDIA 驱动程序版本 PostgreSQL 13 和 Postfix 的新上游稳定版本 各种其他修复 可以在 Debian.org 找到 Debian 11.6 软件包更新的完整列表。至于 Debian 1

2022-09-28

CRUX 是一个轻量级的、针对 x86-64 优化的 Linux 发行版,主要面向有经验的 Linux 用户,它不基于任何其他 Linux 发行版。 距离上一个版本时隔近两年后,CRUX 3.7 正是发布,更新内容如下: 工具链更新 包括 glibc 2.36、gcc 12.2.0 和

2022-12-01

的17Track、Track718——国际物流追踪工具   (5)订单删除到回收站功能 配置路径:订单销售→订单管理→回收站 为了避免后台运营人员误操作导致的数据丢失,我们新增了回收站功能 删除订单后,可以在右上角“回收

2023-01-11

任何更改时,历史条目的 "恢复" 按钮现在被禁用。 当删除一个历史条目时,"密码修改" 时间现在会立即更新。 按字母顺序重新排列了网络浏览器的 URL 覆盖。 改进了条目详情视图中的项目分割 在大多数地方,组路径中的