LINUX.ORG.RU

Паралельное поблочное вычисление CRC32

 


0

1

Интересно, можно ли вычислять CRC32 паралельно? Есть большой участок памяти. Разбиваем на кусочки по 64к. Для каждого кусочка считаем CRC32 паралельно. Потом эти значения как-то комбинируем чтобы получить CRC32 всего большого блока памяти.

★★★

можно. это же тупо деление в столбик.

например у тебя входные 1024 байт.

делишь их на 4 х 256 байт, каждый 256 байт мысленно представляешь как integer длиной 256*8бит(2048). далее идет деление на полином, тут гугли что и как. получаешь 4 остатка: R0, R1, R2, R3.

дальше такая магия:

CRC от исходных данных = CRC(R0 xor CRC(C1<<2048) xor CRC(C2<<4096) xor CRC(C3<<5144)).

причем CRC(C1<<(2^n)) тоже можно посчитать в один ход, это будет умножение на число K такое, что K=CRC(1<<2^n)

example_cat
()
Ответ на: комментарий от PPP328

Это все не то. Это не для больших кусков

vromanov ★★★
() автор топика
Ответ на: комментарий от drsm

У нас не интел. PowerPC. Есть апаратный расчет CRC32 - два блока, которые могут в фоне считать по 4 региона каждый используя DMA.

vromanov ★★★
() автор топика

Нашел в zlib crc32_combine

vromanov ★★★
() автор топика

Есть у Reini Urban в crcutils. Он в принципе там ускорял и допиливал эту тему, что то-то взяли в ядро и т.д.

Deleted
()

Если интол, то в sse4.2 есть аппаратная считалка

eagleivg ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.