Rust `image-rs`의 이미지 블러(Blur) 속도, 5.9배 빨라지다!
Rust `image-rs` 크레이트의 `fast_blur` 함수를 최적화하여 이미지 처리 속도를 대폭 개선
정수 연산(Integer Arithmetic) 및 reciprocal multiplication 기법을 활용하여 부동 소수점 연산의 오버헤드 제거
최적화 결과, u8 픽셀 이미지에서 최대 5.9배의 속도 향상을 달성하여 실시간 애플리케이션 적용 가능
BlurAccumulator 트레이트(Trait) 설계를 통해 픽셀 타입에 관계없이 유연한 최적화 구현
부동 소수점 연산 제거를 통한 성능 향상
저자는 `fast_blur` 함수 내에서 부동 소수점 연산(Floating-point operations)이 성능 병목임을 확인하고, u8 픽셀의 경우 정수 연산(Integer Arithmetic)으로 대체하는 최적화를 수행했다. 특히, `to_f32` 및 `roundf` 함수 호출을 제거하여 메모리 접근(Memory Access) 및 연산 비용(Computational Cost)을 줄였다. 이로 인해, u8 이미지에서 약 1.8배의 속도 향상을 달성했다.
BlurAccumulator 트레이트(Trait) 설계
다양한 픽셀 타입(Pixel Type)에 대응하기 위해, `BlurAccumulator` 트레이트를 설계하여 코드 재사용성(Code Reusability)과 유연성(Flexibility)을 확보했다. 이 트레이트는 픽셀 타입에 따라 적절한 누산기(Accumulator)를 선택하고, 정수 연산 또는 부동 소수점 연산을 수행하도록 구현되었다. 이러한 설계를 통해, u8, u16, f32 등 다양한 픽셀 타입에 대해 최적화된 `fast_blur` 구현이 가능해졌다.
정수 나눗셈(Integer Division) 최적화
정수 연산으로 전환한 후, 정수 나눗셈(Integer Division)이 여전히 성능 병목임을 확인하고, reciprocal multiplication 기법을 적용했다. 이 기법은 나눗셈 연산을 곱셈과 비트 시프트(Bit Shift) 연산으로 대체하여, CPU 파이프라인(CPU Pipeline)의 효율성을 높였다. 그 결과, 정수 연산 기반의 `fast_blur`에서 약 3배의 속도 향상을 추가로 달성했다.
전반적인 성능 개선 및 영향
정수 연산 및 reciprocal multiplication 기법을 결합하여, u8 이미지에 대한 `fast_blur` 함수의 성능을 최대 5.9배 향상시켰다. 이는 19fps에서 120fps로의 개선으로, 비디오 스트리밍(Video Streaming) 또는 게임(Game)과 같은 실시간 애플리케이션(Real-time Application)에 적용할 수 있을 정도의 성능이다. 또한, 이러한 최적화는 `image-rs` 라이브러리의 다음 릴리스에 포함될 예정이다.