SPO600 프로젝트 2부

5650 단어
기억나지 않는 분들을 위해 현재 SVE2 지침을 오픈 소스 프로젝트에 구현하는 프로젝트를 진행 중입니다.

마지막 부분에서는 SVE2 명령을 추가할 수 있는 훌륭한 후보를 찾고 있었습니다.

이 부분에서는 오픈 소스 디렉토리를 살펴보고 확장 가능한 벡터 확장을 구현하는 방법을 살펴봅니다.

우선, 나는 이전에 우리 프로젝트에서 VC 라이브러리로 작업하기로 결정했습니다. https://github.com/VcDevel/Vc

주변을 검색한 결과 이 ​​리포지토리가 SSE 및 Neon보다 더 나은 프로젝트를 가지고 있음을 발견했습니다.

STD-SIMD는 제가 작업했던 프로젝트와 거의 동일하지만 조금 더 발전된 것입니다: https://github.com/VcDevel/std-simd .

여기에서 내 진행 상황을 볼 수 있습니다. 유지 관리 팀과 진행 상황:

문제-1: https://github.com/VcDevel/Vc/issues/320

문제-2: https://github.com/VcDevel/std-simd/issues/34

끌어오기 요청: https://github.com/VcDevel/std-simd/pull/35

저장소를 복제하고 코드를 검색하는 것으로 시작했습니다.

SIMD 명령어가 있습니까? 예.



SVE가 있습니까? 아니.


그러나 SSE가 있습니다. 예.


AVX도 있습니다.



또한 아키텍처를 확인합시다.
X86. 예.


팔/팔64. 아니





모든 파일을 확인한 후 코드 구현을 시작하기로 결정했습니다.
.s .S 파일이 없어서 조금 무서웠지만 계획이 있습니다.
기존 x86 기능을 arm/arm64로 전환하는 것은 If&def가 될 것입니다. arm/64로 SVE2를 구현하려고 합니다.

어떤 옵션이 있습니까?
  • 자동 벡터화
  • 내장 함수
  • 인라인 어셈블리

  • 우리가 무엇을 할 수 있는지 봅시다:
  • 자동 벡터화의 경우 빌드 지침을 변경해야 하지만 구체적이지 않으며 교수가 말했듯이 C 컴파일러가 무엇을 해야 할지 항상 알 수는 없습니다.
  • 내장 함수 및 인라인 어셈블리는 빌드 지침일 뿐만 아니라 소스 코드의 변경 사항이기 때문에 포함하기가 복잡합니다. 코드를 조금 살펴보면 내부에 매크로로 정의된 고유 기능이 있습니다.



  • 또한 다른 지침에 대한 If 문을 찾았습니다.

    simd.c 
    #if _GLIBCXX_SIMD_X86INTRIN
    #include "bits/simd_x86.h"
    #elif _GLIBCXX_SIMD_HAVE_NEON
    #include "bits/simd_neon.h"
    #elif __ALTIVEC__
    #include "bits/simd_ppc.h"
    #endif
    #include "bits/simd_math.h"
    
    


    자동 벡터화로 시작하고 시간이 있으면 arm/arm64 인라인 어셈블리 또는 내장 함수로 약간 작업하기로 결정했습니다.

    아직 하드웨어가 없기 때문에 시간의 증가를 볼 기회는 없지만 최소한 코드를 준비하고 성공적으로 빌드하도록 합시다.

    방금 자동 벡터화에 대한 라이브러리 지침을 읽고 다른 시스템에서 빌드하려고 시도했습니다. 플래그를 내 빌드에 추가하기만 하면 됩니다.

    gcc -O3 -march=armv8-a+sve2 ... // 03 flag to enable auto-vectorization
    
    gcc -O2 -march=armv8-a+sve2 -ftree-vectorize ... // or -ftre...
    


    arm64 및 x86 로컬 컴퓨터가 있으므로 두 컴퓨터를 모두 확인했고 모든 것이 빌드되었습니다. 하지만 위에서 언급했듯이 하드웨어 때문에 차이를 볼 수는 없지만 적어도 미래의 새로운 아키텍처에서는 작동할 것이라는 점은 알고 있습니다.

    이 외에도 코드에 대해 더 깊이 알아보고 최소한 sve2용 내장 함수를 추가해 보기로 했습니다.

    여기에서 모든 진행 상황을 볼 수 있습니다. 이미 몇 개의 파일을 변경했습니다. 헤더 포함:

    #include <arm_sve.h>
    


    그리고 다른 아키텍처와 명령어 사이를 전환하기 위해 ifdef 문을 작성했습니다.

    3부 이후까지 이 작업을 더 진행할 예정이므로 관리자가 내 변경 사항을 코드에 적용할 수 있습니다.

    끌어오기 요청: https://github.com/VcDevel/std-simd/pull/35



    결론



    참조:

    https://developer.arm.com/documentation/100987/0000/

    https://developer.arm.com/architectures/instruction-sets/intrinsics/#f:@navigationhierarchiessimdisa=[sve2]

    ⚠️ 풀 리퀘스트: https://github.com/VcDevel/std-simd/pull/35

    연결



    🖇 팔로우GitHub

    🖇 팔로우

    _p.s 이 게시물은 내 소프트웨어 이식성 및 최적화 수업을 위해 작성되었습니다. 프로젝트 2부

    좋은 웹페이지 즐겨찾기