오픈 소스 라이브러리에 SVE2 지원 추가 - 파트 I

SVE는 가변 벡터 길이 구현을 허용하는 AArch64의 확장으로 사용되는 새로운 SIMD 명령어 세트로 Arm에서 개발했습니다. SVE2는 SVE와 그 전신인 Neon의 상위 집합입니다. SVE 및 SVE2의 많은 이점 중 하나는 벡터 길이 구현이 다른 여러 AArch64 하드웨어에서 동일한 바이너리를 실행할 수 있다는 것입니다. 특히 대규모 데이터 세트를 처리하는 데 적합하며 이러한 이유로 성능을 향상시키기 위해 오픈 소스 라이브러리에서 사용을 구현할 것입니다.

나의 첫 번째 작업은 SVE2 지원을 구현하기 위한 오픈 소스 라이브러리를 찾는 것입니다. 이상적으로는 암호화 또는 멀티미디어 라이브러리와 같은 대량의 데이터를 처리하는 데 사용되는 라이브러리입니다. 오디오 및 오디오 프로그래밍에 관심이 있으므로 거기를 살펴보고 좋은 후보를 찾을 수 있기를 바랍니다. 내 검색 기준은 다음과 같습니다.
  • 오픈 소스
  • 라이브러리 수준 패키지, 응용 프로그램 수준 SVE2 최적화가 덜 유용함
  • SVE2 구현에 접근하는 방법에 대한 아이디어를 수집하기 위해 이미 Neon 구현이 있는 것이 이상적입니다
  • .

    나는 내가 아는 오픈 소스 오디오 응용 프로그램을 생각하는 것으로 시작했고 가장 먼저 떠오른 것은 Audacity였습니다. 나는 교수가 AArch64 서버에서 패키지를 조회하도록 권장하고 하나가 사용 가능한지 확인하면서 dnf 목록을 사용했습니다.



    그런 다음 dnf deplist를 사용하여 최적화를 위한 좋은 대상이 될 대상을 좁히고 시도해야 하는 종속성을 확인했습니다. 좋은 후보가 될 수 있는 여러 라이브러리가 있습니다.

    고급 Linux 사운드 아키텍처 라이브러리(ALSA)





    무료 무손실 오디오 코덱(FLAC)





    리보그





    거기에서 FLAC 라이브러리를 확인하여 소스 코드에 액세스하고 SVE2 최적화가 어떻게 작동할 수 있는지 자세히 알아보았습니다. 웹 사이트의 git URL이 다운되었으므로 지금은 다른 라이브러리를 확인하고 패닝되지 않으면 다시 원을 그리십시오.

    ALSA 라이브러리를 복제하기 위한 관련 정보가 있는 page을 찾았고 그렇게 했습니다.

    git clone git://git.alsa-project.org/alsa-lib.git alsa-lib
    


    불행히도 sve, Neon 또는 AArch64 특정 구현과 관련된 것을 찾으려고 많은 검색을 시도했지만 아무 것도 찾을 수 없었습니다. 다시 나는 계속해서 벽에 부딪히면 이것으로 돌아갈 것입니다.

    내 목록의 마지막은 Libogg입니다. 위치here에 있고 FLAC를 유지 관리하는 동일한 조직에서 유지 관리한다는 사실을 알게 되었습니다. 고맙게도 이 git 링크는 깨지지 않았습니다. 안타깝게도 Neon 또는 SIMD에 대한 참조를 찾을 때 다시 빈 공간이 생겨서 앞서 언급한 FLAC 및 ogg 라이브러리의 유지 관리자인 다양한 xiph 프로젝트를 살펴보기 위해 검색을 확장했습니다. 그렇게 함으로써 저는 AArch64 및 Neon에 대한 특정 참조가 있는 opus라는 훌륭한 후보를 찾았습니다.


    opus/cmake/OpusFunctions.cmake에서 CPU와 컴파일러가 Neon을 지원하는지 확인하는 검사를 찾을 수 있었습니다.



    이는 이 패키지가 SIMD를 활용하고 Neon이 하나의 구현임을 나타냅니다.

    라이브러리를 구성한 후 Makefile을 찾고 어떤 컴파일 옵션을 사용하고 있는지 확인할 수 있었습니다. 이 경우 다음과 같은 내용이 있었습니다.

    CFLAGS = -g -O2 -fvisibility=hidden -D_FORTIFY_SOURCE=2 -W -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes
    


    이 수준을 -O3로 올리면 SVE2 자동 벡터화 최적화가 시작되며, 더 나아가 이 패키지는 opus/celt/arm/pitch_neon_intr.c 소스 파일과 같은 내장 기능을 활용한다는 것을 알았습니다.

    for (i = 0; i < N - 7; i += 8) {
            x_s16x8  = vld1q_s16(&x[i]);
            y_s16x8  = vld1q_s16(&y[i]);
            xy_s32x4 = vmlal_s16(xy_s32x4, vget_low_s16 (x_s16x8), vget_low_s16 (y_s16x8));
            xy_s32x4 = vmlal_s16(xy_s32x4, vget_high_s16(x_s16x8), vget_high_s16(y_s16x8));
        }
    


    SVE2 버전의 내장 함수를 사용하여 pitch_neon_intr.c 및/또는 celt_neon_intr.c에 해당하는 SVE2를 생성하면 SVE2용으로 이 패키지를 최적화할 수 있습니다. 나는 opus 개발자 메일링 리스트에 그렇게 하겠다는 의사를 표명하는 이메일을 보냈고, 이제 남은 것은 그것을 하는 것뿐입니다! 곧 더 많은 정보를 얻을 수 있습니다.

    좋은 웹페이지 즐겨찾기