2

これは、最新のx86-64プロセッサに組み込まれているCRC32命令を使用して、最大1024バイトのCRC32を計算する方法を説明する記事ですただし、1024バイトを超えるCRC32を計算する必要があります。1024バイトの各ブロックのCRC32を計算し、最終的にそれらを合計するのは正しいアプローチでしょうか、それとも正しくありませんか?もしそうなら、それを行う正しい方法は何ですか?

4

2 に答える 2

5

あなたの記事が言及しているインテルのホワイトペーパーから引用すると、

従来の線形方法でメッセージ全体の CRC を計算する代わりに、より高速な方法を使用して、任意の長さのバッファーをいくつかのより小さな固定サイズのセグメントに分割し、これらのセグメントの CRC を並行して計算し、その後に再結合ステップを計算します。セグメントの部分 CRC を使用した効果的な CRC 。

また、

CRC の最終的な再結合はオーバーヘッドを追加し、Nehalem マイクロアーキテクチャのルックアップ テーブルで実装できます。サイズの範囲で優れた全体的なパフォーマンスを提供しながら、できるだけ少ないテーブルでこれを行う方法を示します。Westmere マイクロアーキテクチャの PCLMULQDQ 命令を使用すると、ルックアップ テーブルを使用せずに CRC を効率的に再結合できます。このホワイト ペーパーでは、実際のコード例を使用して、さまざまな方法について詳しく説明します。

そのため、この論文を詳細に学習する必要があります: CRC32 命令を使用した iSCSI 多項式の高速 CRC 計算

于 2012-04-26T13:05:35.827 に答える
4

いいえ、追加するだけでは機能しません。

あなたがリンクした記事は、その方法を教えてくれます:

1 つの計算の CRC 出力は、次の計算の初期 CRC として使用されます [...]

最終結果が大きくなる場合をカバーするには、最終計算の後に0xffffffff行うだけです。crc32 = ~crc32 & 0xffffffff

于 2012-04-26T13:09:18.150 に答える