Xxhash: crc32둜 속도 비ꡐ μ—…λ°μ΄νŠΈ

에 λ§Œλ“  2016λ…„ 04μ›” 24일  Β·  6μ½”λ©˜νŠΈ  Β·  좜처: Cyan4973/xxHash

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λ₯Ό κ³ λ €ν•˜λŠ” 데 μƒλ‹Ήν•œ μ‹œκ°„μ„ λ‚­λΉ„ν–ˆμŠ΅λ‹ˆλ‹€.

question

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

감사!
λ°”μ΄λ„ˆλ¦¬λŠ” 64λΉ„νŠΈμž…λ‹ˆλ‹€.
XXH3_64bit ν™•μ‹€νžˆ 더 λ‚˜μ€ μ„±λŠ₯을 λ³΄μž…λ‹ˆλ‹€. NEON 벑터화λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  3.9GB/sλ₯Ό μ–»κ³  NEON을 μ‚¬μš©ν•˜λ©΄ 4.0GB/s에 κ°€κΉμŠ΅λ‹ˆλ‹€. κ·Έλž˜λ„ vmull_p64 μ‚¬μš©ν•˜λŠ” CRC32λŠ” μ²˜λ¦¬λŸ‰μ΄ μ•½κ°„ 더 μ’‹μŠ΅λ‹ˆλ‹€.

λͺ¨λ“  6 λŒ“κΈ€

λ¬Έμ œλŠ”,
λ²€μΉ˜λ§ˆν¬λŠ” 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λŠ” μ²˜λ¦¬λŸ‰μ΄ μ•½κ°„ 더 μ’‹μŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰