Implementieren des CRC32C von SSE 4.2 in Software

Also ich habe ein design mit CRC32C-Prüfsummen, um sicherzustellen, dass die Daten nicht beschädigt wurde. Ich habe mich entschieden, CRC32C, denn ich kann sowohl eine software-version und hardware-beschleunigte version, wenn der computer läuft die software unterstützt SSE 4.2

Werde ich vom Intel developer manual (vol 2A), die anscheinend den Algorithmus hinter der crc32 Unterricht. Ich bin allerdings mit wenig Glück. Intel developer guide sagt Folgendes:

BIT_REFLECT32: DEST[31-0] = SRC[0-31]
MOD2: Remainder from Polynomial division modulus 2

TEMP1[31-0] <- BIT_REFLECT(SRC[31-0])
TEMP2[31-0] <- BIT_REFLECT(DEST[31-0])
TEMP3[63-0] <- TEMP1[31-0] << 32
TEMP4[63-0] <- TEMP2[31-0] << 32
TEMP5[63-0] <- TEMP3[63-0] XOR TEMP4[63-0]
TEMP6[31-0] <- TEMP5[63-0] MOD2 0x11EDC6F41
DEST[31-0]  <- BIT_REFLECT(TEMP6[31-0])

Nun, soweit ich sagen kann, ich habe alles gemacht bis zu der Linie, die TEMP6 richtig, aber ich denke, ich kann entweder Missverständnis der Polynom-division oder die Umsetzung falsch. Wenn mein Verständnis richtig ist, 1 /1 mod 2 = 10 /1 mod 2 = 0und beide teilt durch null nicht definiert sind.

Was ich nicht verstehe ist, wie man binäre division mit 64-bit-und 33-bit-Operanden arbeiten. Wenn SRC ist 0x00000000und DEST ist 0xFFFFFFFFTEMP5[63-32] werden alle bits, während TEMP5[31-0] werden alle undefinierten bits.

Wenn ich die bits aus TEMP5 als der Zähler, würde es 30 Divisionen durch null, da das Polynom 11EDC6F41 nur 33 bits lang (und damit Umwandlung in eine 64-bit-Ganzzahl ohne Vorzeichen lässt die top-30 bits gelöscht), und so der Nenner ist unset für 30 bits.

Allerdings, wenn ich das Polynom als Zähler, die unteren 32 bits der TEMP5 sind ausgeschaltet, wodurch dividiert durch null gibt, und die top-30 bits, das Ergebnis wäre gleich null, wie die top-30 bits der Zähler auf null, als 0 /1 mod 2 = 0.

Bin ich Missverständnis, wie das funktioniert? Einfach etwas fehlt? Oder hat Intel weggelassen, einige entscheidende Schritt in Ihrer Dokumentation?

Den Grund ging ich zu Intel developer guide für das, was zu sein schien der Algorithmus verwendet, Sie ist, weil Sie verwendet einen 33-bit-Polynom, und ich wollte Ausgänge identisch, was nicht passiert, wenn ich die 32-bit-Polynom 1EDC6F41 (Karte unten).

uint32_t poly = 0x1EDC6F41, sres, crcTable[256], data = 0x00000000;

for (n = 0; n < 256; n++) {
    sres = n;
    for (k = 0; k < 8; k++)
        sres = (sres & 1) == 1 ? poly ^ (sres >> 1) : (sres >> 1);
    crcTable[n] = sres;
}
sres = 0xFFFFFFFF;

for (n = 0; n < 4; n++) {
    sres = crcTable[(sres ^ data) & 0xFF] ^ (sres >> 8);
}

Den oben genannten code erzeugt 4138093821 als Ausgang, und die crc32 opcode erzeugt 2346497208 mit Hilfe der input 0x00000000.

Sorry, wenn dies falsch geschrieben ist, oder unverständlich in Orten, es ist ziemlich spät für mich.

InformationsquelleAutor der Frage LMS | 2013-07-15

Schreibe einen Kommentar