Я боролся с внутренними проблемами. В частности, я не получаю таких же результатов, используя стандартный расчет CRC и , предположительно, эквивалентных интеллектуальных возможностей. Я бы хотел перейти к использованию _mm_crc32_u16
и _mm_crc32_u32
, но если я не могу получить 8-битную операцию, это не имеет смысла._mm_crc32_u8 дает отличный результат, чем код ссылки
static UINT32 g_ui32CRC32Table[256] =
{
0x00000000L, 0x77073096L, 0xEE0E612CL, 0x990951BAL,
0x076DC419L, 0x706AF48FL, 0xE963A535L, 0x9E6495A3L,
0x0EDB8832L, 0x79DCB8A4L, 0xE0D5E91EL, 0x97D2D988L,
....
// Your basic 32-bit CRC calculator
// NOTE: this code cannot be changed
UINT32 CalcCRC32(unsigned char *pucBuff, int iLen)
{
UINT32 crc = 0xFFFFFFFF;
for (int x = 0; x < iLen; x++)
{
crc = g_ui32CRC32Table[(crc^*pucBuff++) & 0xFFL]^(crc >> 8);
}
return crc^0xFFFFFFFF;
}
UINT32 CalcCRC32_Intrinsic(unsigned char *pucBuff, int iLen)
{
UINT32 crc = 0xFFFFFFFF;
for (int x = 0; x < iLen; x++)
{
crc = _mm_crc32_u8(crc, *pucBuff++);
}
return crc^0xFFFFFFFF;
}
Можете ли вы привести пример того, как вы тестируете эти две функции и каков выход? –
Марк Адлер ответил на вопрос. Спасибо, Марк. –