2016-10-03 12 views
0

ここで説明するように、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ビットの最終的な削減

  1. 乗算を定数K5と、残りの128ビットの上位64ビットが、結果は96ビット
  2. 乗算定数K6と96ビットの上位64ビットであります結果は64ビット

これらの結果は、前のフォールドのパターンに従い、最初の128ビットの下位64ビットと排他的論理演算する必要がありますか?紙の図8は指定していない、と私は図のデータの配置によって混乱しています。

+0

インテルは既にこのホワイトペーパーに基づいてチューニングされた実装を公開しています。したがって、ライセンスがあなたのニーズに適合していればそれを使いたいかもしれません。 [それは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) –

+1

@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

+0

@PeterCordes - ビットが反映されたCRCのためのチューニングされた実装を見つけることができませんでしたので、チューニングされた実装を変更しましたが、Intelのホワイトペーパーが示すように単純ではありません。 xmmレジスタ全体をビット反転する必要があるため、小数点からビッグエンディアンへの変換に使用されるpshufbはすべて削除されます。左/右揃えの定数は、製品の結果が終了し、関連がシフトする(またはシフトしない)場合に影響を受けます。私はパラメータとして渡された最初のcrcの値を処理する必要があることを除いて、動作しています。 – rcgldr

答えて

1

図8は、crc32 =(msg(x)・x^32)%p(x)の後に32ビットの付加ゼロが続き、最後の128ビット(バッファデータの剰余xまたは最後の128ビット) )。したがって、合計160ビットが64 | 32 | 32 | 32と表示されます。

私の前提は、上位64ビットにK5を掛けて96ビットの積を生成することです。その後、その製品は160ビットエンティティの下位96ビットにxorされます(下位32ビットは32ビットの付加ゼロから始まることに注意してください)。

次に、下位96ビットの上位32ビット(64ではなく)にK6が乗算され、64ビット積が生成され、160ビットエンティティの下位64ビットにxorされます。

次に、Barrettアルゴリズムを使用して、160ビットエンティティの下位64ビットから32ビットCRCを生成します(下位32ビットはもともとは0が追加されています)。

+0

ありがとうございました! 32ビットのゼロを追加し、乗算の結果を下位ビットでxoringすることによって、正しく動作するようにしました。 –

関連する問題