ここで説明するように、CRC32計算アルゴリズムを実装しようとしています。 http://www.intel.com/content/dam/www/public/us/en/documents/white-papers/fast-crc-computation-generic-polynomials-pclmulqdq-paper.pdf;私はステップ3、128ビットから64ビットへの削減について混乱しています。うまくいけば、誰かが私のための手順を明確にすることができる:PCLMULQDQを使用した高速CRC - 128ビットの最終的な削減
- 乗算を定数K5と、残りの128ビットの上位64ビットが、結果は96ビット
- 乗算定数K6と96ビットの上位64ビットであります結果は64ビット
これらの結果は、前のフォールドのパターンに従い、最初の128ビットの下位64ビットと排他的論理演算する必要がありますか?紙の図8は指定していない、と私は図のデータの配置によって混乱しています。
インテルは既にこのホワイトペーパーに基づいてチューニングされた実装を公開しています。したがって、ライセンスがあなたのニーズに適合していればそれを使いたいかもしれません。 [それはgithubにある](https://github.com/01org/isa-l/blob/master/crc/crc16_t10dif_01.asm)。その[XORPSとPXORの混合について]この質問も参照してください(http://stackoverflow.com/questions/39811577/does-using-mix-of-pxor-and-xorps-affect-performance) –
@PeterCordes - 私は変換githubのコードをVisual Studio 2015で動作させる必要があります。rk3とrk4のコメントは間違っています。おそらく、一度に64バイトではなく一度に128バイトを折りたたむようにコードが拡張されたからです。 rk3は2 ^(32 * 31)mod Q << 32であり、rk4は2 ^(32 * 33)mod Q << 32.です。rk9からrk20はコメントされません。 <32の場合、rk9からrk20のxは{27、29、23、25、19、21、15、17、11、13、7,9}(rk3、 rk4)。 – rcgldr
@PeterCordes - ビットが反映されたCRCのためのチューニングされた実装を見つけることができませんでしたので、チューニングされた実装を変更しましたが、Intelのホワイトペーパーが示すように単純ではありません。 xmmレジスタ全体をビット反転する必要があるため、小数点からビッグエンディアンへの変換に使用されるpshufbはすべて削除されます。左/右揃えの定数は、製品の結果が終了し、関連がシフトする(またはシフトしない)場合に影響を受けます。私はパラメータとして渡された最初のcrcの値を処理する必要があることを除いて、動作しています。 – rcgldr