Nehalem(SSE 4.2) μ΄ν μ¬μ© κ°λ₯ν crc32 λͺ λ Ήμ΄λ₯Ό μ¬λ°λ₯΄κ² μ¬μ©νλ©΄ 8λ°μ΄νΈλΉ 1.17μ¬μ΄ν΄μ μ²λ¦¬λμ λ¬μ±ν μ μμΌλ©°, μ΄λ μ΄μμ μΈ μ‘°κ±΄μμ 3ghz νλ‘μΈμμμ 20.5GB/sμ μ΄λ‘ μ μΈ μ±λ₯μ΄ λ©λλ€. μΆμ²: http://www.drdobbs.com/parallel/fast-parallelized-crc-computation-using/229401411?pgno=2
μ½κ°μ μΈν°λ· κ²μμ μ΄λ‘ μ μμΉμ λ§€μ° μ μΌμΉνλ 20GB/s μ²λ¦¬λμ μΈμ©νλ μ΄ SO μ§λ¬Έμ λνλ λλ€. http://stackoverflow.com/questions/17645167/implementing-sse-4-2s-crc32c-in- μννΈμ¨μ΄
νλμ¨μ΄ crc32κ° μ€μ λ‘ xxhashλ³΄λ€ ~3λ°° λΉ λ¦ λλ€. κ·Έκ²μ΄ λ μ ν©ν ν΄μ μκ³ λ¦¬μ¦μ΄λΌλ λ§μ μλμ§λ§, μ±λ₯ λ©΄μμ crc32μ κ·Όμ ν μ μλ€λ κ²μ κΉ¨λ«κΈ° μ μ 체ν¬μ¬ λͺ©μ μΌλ‘ 벑ν°νλ xxhash λ crc32λ₯Ό κ³ λ €νλ λ° μλΉν μκ°μ λλΉνμ΅λλ€.
λ¬Έμ λ,
λ²€μΉλ§ν¬λ Core 2 Duo @3GHzμμ μ€νλμμ΅λλ€.
μ΄ CPUλ νλμ¨μ΄ crc32cλ₯Ό μ§μνμ§ μμ΅λλ€.
λν crc32μ crc32cλ λΉμ·νμ§λ§ λ€λ₯Έ μκ³ λ¦¬μ¦μ
λλ€. λμΌν κ²°κ³Όλ₯Ό μ»μ μ μμ΅λλ€.
crc32λ λ리 μ¬μ©λμ§λ§ crc32cλ ν¨μ¬ μ μ΅λλ€. μ΄λ¬ν λͺ
λͺ
νΌλμ μ¬μν μνΈ μ΄μ©μ± λ¬Έμ λ₯Ό μ λ°ν μ μμ΅λλ€.
μ¬κΈ°μμ λ²€μΉλ§ν¬λ crc32 λ²μ μ μ€λ§€μ
ν
μ€νΈ μ€μνΈ λ΄μμ μ 곡λλ λ²μ μ
λλ€.
벑ν°νλ λ²μ μ ν¬ν¨νμ¬ λ λΉ λ₯Έ λ²μ μ΄ μμ΅λλ€.
ν΅ν©νλ €λ©΄ ν
μ€νΈ μ€μνΈλ₯Ό μμ ν΄μΌ ν©λλ€.
μμ© νλ‘κ·Έλ¨μ λν Intel μ’ μμ±μ νμ©ν μ μκ³ λͺ¨λ ν΄λΌμ΄μΈνΈ CPUκ° μΆ©λΆν μ΅μ μμ 보μ₯ν μ μλ€λ©΄(2016λ μ ν©λ¦¬μ μ) νλμ¨μ΄ crc32cλ₯Ό μ¬μ©ν μ μμ΅λλ€. μ΄λ μ€μ λ‘ λ§€μ° λΉ λ¦ λλ€.
xxHashλ μ΄ κΈ°λ₯μ΄ μλ CPUλ₯Ό μ¬μ©νμ¬ Intelμ μμ(arm, mips, power λ±)μ ν¨μ¬ λ₯κ°νλ μ΅λ μ΄μμ±μ μλν λͺ©νλ‘ λ€λ₯Έ 컨ν μ€νΈμμ λ§λ€μ΄μ‘μ΅λλ€. λ°λΌμ λΈλλλ³ κΈ°λ₯μ μμ‘΄νμ§ μμ΅λλ€.
@cyan4973
μ λ§ λ¦μ νμ μ‘°μΉλ‘ crc32cμ λΉκ΅νμ¬ μλ‘μ΄ XXH3μ λν ν΅μ°°λ ₯μ μ 곡ν μ μμ΅λκΉ?
νλμ¨μ΄ crc32c
μ체λ κ²½μλ ₯μ΄ μμ΅λλ€. μννΈμ¨μ΄ crc32λ³΄λ€ νμ€ν λΉ λ₯΄μ§λ§ λλΆλΆμ μ΅μ ν΄μ μκ³ λ¦¬μ¦μ΄ μ¬μ©νλ ILPλ₯Ό λ°λΌκ° μ μμ΅λλ€.
κ·Έλ¬λ μ¬λ¬ crc32c
μ±λμ λ³λ ¬λ‘ μ¬μ©νλ κ²μ΄ λ ν¨μ¨μ μΌ μ μμ΅λλ€. μ΄ κ²½μ° μ νν κ²°κ³Όλ ꡬνμ λ°λΌ λ€λ¦
λλ€. μΈν°λ·μ ν΅ν΄ λ§μ ꡬνμ μ°Ύμ μ μμ΅λλ€. XXH64
μλλ₯Ό μ΅λνν μ μλ λͺ κ°μ§ ꡬνμ μ°Ύμμ§λ§ XXH3
μ΅κ³ κ° λ μ μλ ꡬνμ μμ§ μμ΅λλ€. μλ§λ λ κ²μνλ λ¬Έμ μΌ κ²μ
λλ€.
CRC32 λ° CRC32Cλ ββIntelμ pclmulqdq λλ ARMv8 CLMUL λͺ λ Ήμ΄λ₯Ό μ¬μ©νμ¬ λ§€μ° ν¨μ¨μ μΌλ‘ ꡬνν μ μμ΅λλ€.
μΌλ§ μ μ CRC32 λ° CLMUL λͺ λ Ήμ΄λ₯Ό μ¬μ©νμ¬ λͺ κ°μ§ ARM ꡬνμ κ²°ν©νμΌλ©° ν΄λΉ μλλ rk3399μμ μ½ 4.1GB/sλ‘ λΆλν©λλ€. μ΄μ xxh32 λ° xxh64μ λΉκ΅νμ¬ κ°κ° 3.5GB/s λ° 2.5GB/sλ₯Ό μ»μμ΅λλ€.
ARMv8μμ xxh64κ° xxh32λ³΄λ€ λ릴 κ²μΌλ‘ μμλ©λκΉ? μλλ©΄ λ¬Έμ κ° μμ΅λκΉ?
xxh64
λ 32λΉνΈ λ°μ΄λ리μμ xxh32
λ³΄λ€ λ릴 κ²μΌλ‘ μμλ©λλ€.
64λΉνΈ λ°μ΄λ리μμλ κ·Έλ΄ κ°λ₯μ±μ΄ μ μ§λ§ μ¬μ ν μ½νκ±°λ λλ¦° 64λΉνΈ κ³±μ
λͺ
λ Ήμ΄κ° μλ μΉ©μ μμν μ μμ΅λλ€. μ΄ κ²½μ° 32λΉνΈλ³΄λ€ ν¨μ¬ λ립λλ€.
λΆννλ ARMv8 μΉ© μ νκ΅°μ μλΉν ν¬λ©° κ° μΉ©μ λ§€μ° λ€λ₯Έ μ±λ₯ νΈλ μ΄λμ€νλ₯Ό νΉμ§μΌλ‘ ν μ μμ΅λλ€. κ·Έλμ λλ μ΄ μ¬κ±΄μ΄ μ΄λμ κ° μΌμ΄λμΌ νλ€κ³ λ§νκ³ μΆμ§λ§ κ·Έκ²μ κ·μΉμΌλ‘ λ§λ€μ§λ μμ κ²μ
λλ€.
ARMμμ λ λΉ λ₯Έ 64λΉνΈ ν΄μλ₯Ό μ¬μ©νλ €λ©΄ μ΅μ 릴리μ€μ ν¬ν¨λ μ΅μ XXH3_64bit()
λ₯Ό μ¬μ©ν΄ 보μμμ€.
κ°μ¬!
λ°μ΄λ리λ 64λΉνΈμ
λλ€.
XXH3_64bit
νμ€ν λ λμ μ±λ₯μ 보μ
λλ€. NEON 벑ν°νλ₯Ό μ¬μ©νμ§ μκ³ 3.9GB/sλ₯Ό μ»κ³ NEONμ μ¬μ©νλ©΄ 4.0GB/sμ κ°κΉμ΅λλ€. κ·Έλλ vmull_p64
μ¬μ©νλ CRC32λ μ²λ¦¬λμ΄ μ½κ° λ μ’μ΅λλ€.
κ°μ₯ μ μ©ν λκΈ
κ°μ¬!
λ°μ΄λ리λ 64λΉνΈμ λλ€.
XXH3_64bit
νμ€ν λ λμ μ±λ₯μ 보μ λλ€. NEON 벑ν°νλ₯Ό μ¬μ©νμ§ μκ³ 3.9GB/sλ₯Ό μ»κ³ NEONμ μ¬μ©νλ©΄ 4.0GB/sμ κ°κΉμ΅λλ€. κ·Έλλvmull_p64
μ¬μ©νλ CRC32λ μ²λ¦¬λμ΄ μ½κ° λ μ’μ΅λλ€.