私は最近CloudFlare's optimized zlibで遊んでいて、結果は本当に印象的です。zlib CRC32でキャリーレス乗算アセンブリ(PCLMULQDQ)を正しく使用する方法は?
残念ながら、彼らはzlibの開発が放棄され、そのフォークが破棄されたと思われるようです。私は最終的にmanually rebase their changesにcurrent zlib developmentのブランチに行くことができましたが、それはお尻の本当の痛みでした。
とにかく、私はすなわち、利用することができていないCloudFlareのコード内の1つの主要最適化、fast CRC32 code implemented with the PCLMULQDQキャリーレス乗算命令は、新しいに含まれ(ハスウェル以降、私は信じている)Intelプロセッサがあるため、まだあります:
私はMac上だし、打ち鳴らす統合アセンブラやAppleの古代ガスのどちらも使用新しいGASニーモニックを理解し、 と
コードは、Linuxカーネルから持ち上げられているましたGPL2はライブラリ全体をGPL2にし、基本的に私の目的には役に立たない。
だから私は周りにいくつかの狩猟をした、と私はAppleが自分のbzip2で使用しているいくつかのコードにつまずいた数時間後:arm64とx86_64の両方のための手書き、ベクトル化CRC32の実装。 、
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.
しかし残念ながら、私:
奇妙な話、x86_64のアセンブリのためのコメントは、arm64ソースに(のみ)ですが、このコードは、zlibのに使用できることを示しているように見えるんいくつかの試みの後、この時点で私は少し頭の中にいるようです。そして、私は実際どのようにを行うのか分からない。。だから、誰かがどのように/どこで機能を提供するかを私に見せてくれることを望んでいた。
(実行時に必要な機能が検出され、ハードウェア機能が利用できない場合はソフトウェアの実装に戻ってしまう可能性があるので、素晴らしい方法ですので、配布する必要はありませんしかし、少なくとも、ライブラリをApple PCLMULQDQベースのCRC32を正しく使用する方法を誰かが助けてくれれば、それは長い道のりになります。)
。インテルのマニュアルを確認してください。 – James