Rust에서 어셈블리 호출, 왜 C보다 느릴까?

by DD
5개월 전
조회수 10

Rust에서 어셈블리 함수를 호출하는 속도가 C보다 느린 현상 발생

메모리 레이아웃 문제로 인해 스택 할당 방식에 차이가 생겨 성능 저하 발생

FFISafe 구조체 사용을 개선하여 컴파일러 최적화를 유도, 성능 향상 달성

Rust와 C 어셈블리 호출 비교

Rust에서 어셈블리 함수를 호출하는 과정에서 C보다 성능 저하가 발생하는 원인을 분석한다. 구체적으로, `cdef_filter_neon_erased` 함수 내에서 발생하는 메모리 접근 문제에 주목한다. 따라서, 스택 할당 방식의 차이가 성능 차이를 유발하는 주요 원인으로 지목된다. 결과적으로, 캐싱 문제가 성능 저하의 핵심 요소로 작용한다.

FFISafe 구조체와 컴파일러 최적화

FFISafe 구조체를 사용하여 RustC 간의 상호 운용성을 확보하는 과정에서 발생하는 문제점을 분석한다. 반면, `WithOffset` 구조체의 FFI 안전성을 확보하기 위해 `#[repr(C)]` 어노테이션을 추가하여 컴파일러가 최적화를 수행할 수 있도록 유도한다. 결과적으로, 메모리 레이아웃을 개선하여 성능을 향상시킨다.

실제 적용을 위한 전략

성능 개선을 위해 FFISafe 구조체를 수정하고, `WithOffset` 구조체를 FFI-safe하게 변경하는 방법을 제시한다. 구체적으로, `WithOffset` 구조체를 `#[repr(C)]`로 선언하여 FFI 경계에서 컴파일러가 최적화를 수행하도록 한다. 따라서, RustC 간의 호출 규약을 준수하면서 성능을 개선할 수 있다. 결과적으로, 코드 품질성능을 동시에 향상시킨다.

Why is calling my asm function from Rust slower than calling it from C?

댓글 0

첫 번째 댓글을 남겨보세요!