유리수 전처리로 9차 다항식 평가를 곱셈 8회에서 5회로 줄인 인터랙티브 데모
- 논문 방식은 예시 9차 단항 다항식을 정확하게 계산하면서 곱셈 5회, 덧셈 20회, 곱셈 깊이 4로 평가함. Horner 방식은 곱셈 8회와 덧셈 9회가 필요함
- 유리수 전처리로 계산 사슬의 상수를 정확하게 유지함. 비교 대상인 Knuth-Eve와 Pan의 5회 곱셈 사슬은 실수 근이나 수치 전처리에 의존해 이중정밀도에서 각각 최대 상대오차 약 7.9e-11, 1.0e-11을 보임
- Horner는 앞 단계 결과가 다음 단계에 필요한 순차 계산인 반면, Estrin 방식은 곱셈 11회로 같거나 더 많은 연산을 쓰되 곱셈 깊이를 4로 낮춰 병렬 처리에 맞춤
- 논문 5.9절은 주입적 다항식 해싱에서 랜덤 키 하나로 2N개 값을 해싱하는 데 N회 곱셈을 쓰는 구성을 제시함. 저자 설명상 Poly1305와 Polymur 같은 범용 해시에 적용 가능하지만 실사용 최고 성능을 넘는지는 미확정임
- 사이트는 Horner, Estrin, Rabin-Winograd, Knuth-Eve, Pan과 새 방식을 같은 다항식에 적용한 계산 사슬, 곱셈 수, 덧셈 수, 곱셈 깊이, 정확도를 비교해 표시함
Hacker News opinions
CRC8처럼 테이블을 쓰는 방식보다도 빠른 건지 궁금함.
CRC8은 입력을 다항식 계수로 보고 고정 다항식으로 나머지를 구하는 문제라 다름. 여기서는 계수를 미리 알고 있는 다항식을 전처리해 빠르게 계산하며, 논문 5.9절은 CRC에 가까운 범용 해싱도 다룸.
WyHash나 xxh3 같은 빠른 해시에 적용되는지, 아니면 주로 암호 해시용인지 궁금함.
Poly1305나 Polymur 같은 범용 해시에는 적용 가능함. 다만 실제 최고 성능을 이기는지는 아직 불분명하고, WyHash와 xxh3은 다항식 구조가 아님.
WyHash와 xxh3이 빠른 이유 중 하나는 실제 체 곱셈 대신 휴리스틱을 쓰기 때문임. 그래서 무작위 키에서도 충돌 확률을 비정상적으로 높이는 적대적 입력을 만들 수 있고, 논문 165쪽에서 둘 다 분석함.
알고리즘을 바꾸면 예제 함수가 ln(1+x) 같은 선택값에서 monic으로 계속 돌아가고 나중엔 고정되는 듯함. Horner와 비교해 FMA 연산 수는 어떻게 되는지도 궁금함.
monic은 예제 함수 선택과 별도 스위치임. 켜면 선행 계수를 제거함.
곱셈 수와 덧셈 수를 맞바꾸는 이유가 뭔지 궁금함. 요즘 컴퓨터에선 곱셈이 덧셈보다 빠르지 않나?
부동소수점이라면 FMA, 수치 안정성, 파이프라이닝 면에서 Estrin 방식을 쓰는 편이 낫다고 봄. 하지만 해싱과 암호에 쓰는 유한체에서는 곱셈이 덧셈보다 훨씬 비싸서 이 알고리즘의 주된 대상이 됨.
현대 CPU도 곱셈은 덧셈보다 지연 시간이 1-2클록 큰 경우가 많고, 덧셈 실행 유닛이 더 많은 CPU도 있음. 예를 들어 AMD Zen은 벡터 덧셈 4개와 곱셈 또는 FMA 2개를 클록당 처리할 수 있음.
미리 전처리할 거면 여러 점에서 계산할 테니 FFT 다점 평가를 쓰면 되지 않나?
FFT 다점 평가는 모든 평가점을 미리 알 때 좋음. 해시맵의 다항식 해시나 표준 라이브러리 exp 근사처럼 입력이 스트리밍으로 들어오는 경우에는 맞지 않음.
유한체에서는 특히 흥미롭지만, 유리수 Q에서는 계수가 너무 빨리 커지는 듯함.
다항식 역함수도 같은 차수라 가장 큰 계수가 커지는 문제가 있음. Knuth-Eve와 Pan은 차수 d 다항식의 근을 써서 조금 작지만, 여전히 실용적이지 않음.