2012-03-01 9 views
6

CRC64のさまざまな実装を確認しました。例えば、this,thisおよびthis。これらすべての問題は、バイトで動作することです。しかし、64ビットシステムでは、long(8バイト)で作業したいと思います。このようにして、私は反復を少なくする必要があります。たとえば、128バイトのデータの場合は、byteを使用して、128回反復する必要がありますが、longでは16回しか反復する必要はありません。long(64ビット)を使用したCRCチェックサム

longを使用するCRC64実装はありますか、1バイトよりも大きなワードサイズを使用していますか?これらのスキームは変更することができますか?

+2

SSEが利用可能であれば、GCCはループをアンロールし、可能であれば128ビットのXMMレジスタを使用する可能性が最も高いです。だから、盲目的にコードを最適化する時間を過ごす前に、あなたのコンパイラが何をしているかを確認してください。 –

+1

雅ですが、計算は周期的で、私はベクトル化できないと考えています。 – pythonic

+1

コンパイラーよりもスマートにしようとする前に、それがいかにスマートであるかを確認してください。 GCCは多くのループ分析を行いますが、そのうちのいくつかはあなたが聞いたことがないと確信しています。それは、循環的な計算のためにさえループをアンロールすることができます(実際には特定の状況下で)。私はそれがあなたのケースではないと言っているわけではありませんが、独自の最適化を進める前に確認する必要があります。 –

答えて

13

CRC計算では、ビットごとにデータを処理する必要がないというトリックが使用されています。複数のビットを一度に処理できるルックアップテーブルを使用します。

ビットを一度に処理すると、サイズ2^nのルックアップテーブルが必要です。リンクした実装は、一度に1バイト(8ビット)を読み込み、実際にはそれらのすべてがサイズ256 == 2^8のルックアップテーブルを使用します。

一度に64ビットを処理するには、サイズが2^64のルックアップテーブルが必要です。これは実用的ではありません。これがCRCの一般的な実装が一度に1バイトを処理する理由です。

65536エントリのアレイを使用して一度に2バイトを処理することは可能ですが、CPUキャッシュメモリを増やすことでパフォーマンスに悪影響を与える可能性があります。

+1

ルックアップテーブルがハードウェア実装でも使用されていますか? –

+0

@Vladハードウェアの実装についてはよく分かりません。 – interjay

+0

@VladLazarenko:シリアル通信とリンクされ、ボーレートと同じ速度で動作し、各ビットを順番に処理し、ルックアップテーブルを必要としないハードウェア実装があります。 – quamrana

関連する問題