これは、最新のx86-64プロセッサに組み込まれているCRC32命令を使用して、最大1024バイトのCRC32を計算する方法を説明する記事です。ただし、1024バイトを超えるCRC32を計算する必要があります。1024バイトの各ブロックのCRC32を計算し、最終的にそれらを合計するのは正しいアプローチでしょうか、それとも正しくありませんか?もしそうなら、それを行う正しい方法は何ですか?
2 に答える
あなたの記事が言及しているインテルのホワイトペーパーから引用すると、
従来の線形方法でメッセージ全体の CRC を計算する代わりに、より高速な方法を使用して、任意の長さのバッファーをいくつかのより小さな固定サイズのセグメントに分割し、これらのセグメントの CRC を並行して計算し、その後に再結合ステップを計算します。セグメントの部分 CRC を使用した効果的な CRC 。
また、
CRC の最終的な再結合はオーバーヘッドを追加し、Nehalem マイクロアーキテクチャのルックアップ テーブルで実装できます。サイズの範囲で優れた全体的なパフォーマンスを提供しながら、できるだけ少ないテーブルでこれを行う方法を示します。Westmere マイクロアーキテクチャの PCLMULQDQ 命令を使用すると、ルックアップ テーブルを使用せずに CRC を効率的に再結合できます。このホワイト ペーパーでは、実際のコード例を使用して、さまざまな方法について詳しく説明します。
そのため、この論文を詳細に学習する必要があります: CRC32 命令を使用した iSCSI 多項式の高速 CRC 計算
いいえ、追加するだけでは機能しません。
あなたがリンクした記事は、その方法を教えてくれます:
1 つの計算の CRC 出力は、次の計算の初期 CRC として使用されます [...]
最終結果が大きくなる場合をカバーするには、最終計算の後に0xffffffff
行うだけです。crc32 = ~crc32 & 0xffffffff