【发布时间】:2016-09-19 07:35:38
【问题描述】:
我最近一直在玩CloudFlare's optimized zlib,结果确实令人印象深刻。
不幸的是,他们似乎认为 zlib 的开发已被放弃,并且他们的分叉分离了。我最终能够将manually rebase their changes 转到current zlib development 分支,尽管这真的很痛苦。
无论如何,CloudFlare 代码中还有一个 主要 优化我无法使用,即 fast CRC32 code implemented with the PCLMULQDQ 包含在较新版本(Haswell 和更高版本,我相信)英特尔处理器,因为:
我在 Mac 上,clang 集成汇编器和苹果古老的 GAS 都不理解使用的较新的 GAS 助记符, 和
代码是从 Linux 内核提取的,是 GPL2,这使得整个库 GPL2,因此基本上使它对我的目的毫无用处。
所以我四处寻找,几个小时后,我偶然发现了 Apple 在其 bzip2 中使用的一些代码:arm64 和 x86_64 的手写矢量化 CRC32 实现。
奇怪的是,x86_64 程序集的 cmets (仅)在 arm64 源代码中,但似乎确实表明此代码可以与 zlib 一起使用:
This function SHOULD NOT be called directly. It should be called in a wrapper
function (such as crc32_little in crc32.c) that 1st align an input buffer to 16-byte (update crc along the way),
and make sure that len is at least 16 and SHOULD be a multiple of 16.
但不幸的是,经过几次尝试,我现在似乎有点过头了。而且我不确定如何真正做到这一点。所以我希望有人能告诉我如何/在哪里调用所提供的函数。
(如果有一种方法可以在运行时检测到必要的功能,并且如果硬件功能不可用,可以回退到软件实现,那么我就不必分发多个二进制文件。但是,至少,如果有人可以帮助我弄清楚如何让库正确使用基于 Apple PCLMULQDQ 的 CRC32,那将有很长的路要走,无论如何。)
【问题讨论】:
-
您可以在运行时使用 CPUID 指令枚举硬件功能。查看英特尔的文档。
标签: c assembly mathematical-optimization zlib crc32