SPO 600 프로젝트 3부 - 분석

8553 단어
소개

이것은 오픈 소스 프로젝트에 SVE2 명령을 구현하는 프로젝트의 마지막 부분입니다. 읽어 주셔서 감사합니다.

아직 두 번째 글을 읽지 않았다면 여기를 참조하세요.

또한 여기에서 저장소에 대한 링크를 볼 수 있습니다.

https://github.com/aserputov/std-simd

풀 요청: https://github.com/VcDevel/std-simd/pull/35

이 프로젝트를 위해 SVE2로 작업하는 두 가지 다른 방법을 수행했습니다.
  • 자동 벡터화
  • 내장 함수

  • 또한 라이브러리를 테스트하는 데 도움이 되는 두 가지 다른 유형의 시스템이 있습니다.

    우리의 지침을 모든 파일에 적용할 수는 없지만 적어도 나는 무언가를 시도했습니다.


    아직 ARM9용 하드웨어가 없기 때문에 큰 차이는 없을 것입니다.



    SVE2용 프로젝트에 다른 변수를 추가했습니다.


    업데이트: 프로젝트 파트 2에 대한 피드백을 받은 후.

    내 초기 아이디어는 자동 벡터화 작업이었습니다.

    지금 보니 헤더 라이브러리에 자동 벡터화를 추가할 방법이 없습니다.

    이것이 내 프로젝트의 두 번째 부분에서 SVE2와 함께 내장 함수를 사용하기로 결정한 이유입니다.

    여기에서 내 진행 상황을 추적할 수 있습니다.
    https://github.com/VcDevel/std-simd/pull/35

    그러나 이제 내장 기능에 대한 내 아이디어가 무엇인지에 대해 자세히 알아보십시오.

    내 분석의 첫 번째 단계: https://developer.arm.com/documentation/100748/0616/SVE-Coding-Considerations-with-Arm-Compiler/Using-SVE-and-SVE2-intrinsics-directly-in-your-C-code

    Intrinsics are C or C++ pseudo-function calls that the compiler replaces with the appropriate SIMD instructions. These intrinsics let you use the data types and operations available in the SIMD implementation, while allowing the compiler to handle instruction scheduling and register allocation.
    


    내 코드 단계:

    헤더 파일 포함

    #ifdef __ARM_FEATURE_SVE
    #include <arm_sve.h>
    #endif /* __ARM_FEATURE_SVE */ 
    
    // All functions and types that are defined in the header file have the prefix sv, to reduce the chance of collisions with other extensions.
    


    내 코드에서는 51행에 있습니다https://github.com/VcDevel/std-simd/blob/5a1ef0e3c5ccc36fbc4af8fb1ad8c89e6e6d0dd4/experimental/bits/simd.h#L51.

    SVE 벡터 유형.
    arm_sve.h는 SVE 벡터 레지스터의 값을 나타내는 다음 C 유형을 정의합니다. 각 유형은 벡터 내의 요소 유형을 설명합니다.

    지금은 Sve2 유형으로 몇 가지 변수 유형을 업데이트했습니다.
    일이 너무 큰 것 같아서 아직 진행 중입니다.
    (참고: std-simd 라이브러리의 미래 로직을 위해 Sve2용constexpr을 생성했다고 언급하고 싶습니다. SVE2에 대해 많은 도움이 되지는 않지만 어느 정도 도움이 될 것이라고 생각했고 여전히 생각하고 있습니다.)

    !Docs
    Common situations where SVE types might be used include:
    
    As the type of an object with automatic storage duration.
    As a function parameter or return type.
    As the type in a (type) {value} compound literal.
    As the target of a pointer or reference type.
    As a template type argument.
    


    그만큼
    SVE2 내장 함수

    !Docs reference
    To enable only the base SVE2 instructions, use the +sve2 option with the armclang -march or -mcpu options. To enable additional optional SVE2 instructions, use the following armclang options:
    
    +sve2-aes to enable scalable vector forms of AESD, AESE, AESIMC, AESMC, PMULLB, and PMULLT instructions.
    +sve2-bitperm to enable the BDEP, BEXT, and BGRP instructions.
    +sve2-sha3 to enable scalable vector forms of the RAX1 instruction.
    +sve2-sm4 to enable scalable vector forms of SM4E and SM4EKEY instructions.
    You can use one or more of these options. Each option also implies +sve2. For example, +sve2-aes+sve2-bitperm+sve2-sha3+sve2-sm4 enables all base and optional instructions. For clarity, you can include +sve2 if necessary.
    


    내장 기능을 사용하는 방법에 대한 몇 가지 요점이 있지만 여전히 이 헤더 라이브러리에 추가할 수 있는 방법을 찾고 있습니다.
    예.(나는 사용한다)

    void daxpy_1_1(int64_t n, double da, double *dx, double *dy)
    {
        for (int64_t i = 0; i < n; ++i) {
            dy[i] = dx[i] * da + dy[i];
        }
    }
    



    void daxpy_1_1(int64_t n, double da, double *dx, double *dy)
    {
        int64_t i = 0;
        svbool_t pg = svwhilelt_b64(i, n);                                       // [1]
        do {
            svfloat64_t dx_vec = svld1(pg, &dx[i]);                     // [2]
            svfloat64_t dy_vec = svld1(pg, &dy[i]);                     // [2]
            svst1(pg, &dy[i], svmla_x(pg, dy_vec, dx_vec, da));         // [3]
            i += svcntd();                                              // [4]
            pg = svwhilelt_b64(i, n);                                   // [1]
        }
        while (svptest_any(svptrue_b64(), pg));                                   // [5]
    }
    


    https://developer.arm.com/documentation/100987/0000/
    이 작업을 진행하고 게시물을 업데이트하겠습니다.

    또한 std-simd 라이브러리에서 자동 벡터화를 실제로 보여주지 않았고 실제로 빌드하지 않았기 때문에 어떻게 작동하는지에 대한 지식이 있음을 보여주기로 결정했고 them()을 적용하기 위해 하나의 추가 라이브러리를 사용했습니다.

    내 선택은 이 프로젝트에 속합니다.
    https://github.com/cisco/openh264

    이스라엘과 포르투갈 서버를 제외하고 자체 arm64 및 x86 로컬 시스템도 가지고 있었기 때문에 다른 시스템에서 빌드하고 테스트하기가 쉬웠습니다.

    여기 : make OS=ios ARCH=**ARCH**
    !DOCS
    
    Valid values for **ARCH** are the normal iOS architecture names such as armv7, armv7s, arm64, and i386 and x86_64 for the simulator. Another settable iOS specific parameter is SDK_MIN, specifying the minimum deployment target for the built library. For other details on building using make on the command line, see 'For All Platforms' below.
    






    with find 명령 후에 다음 실행 파일을 찾았습니다.

    
    -rw-r--r--   1 anatoliyserputov  staff   443656 libcommon.a
    -rw-r--r--   1 anatoliyserputov  staff     8160 libconsole_common.a
    -rw-r--r--   1 anatoliyserputov  staff  1604152 libdecoder.a
    -rw-r--r--   1 anatoliyserputov  staff  2019888 libencoder.a
    -rw-r--r--   1 anatoliyserputov  staff  4444584 libopenh264.a
    -rw-r--r--   1 anatoliyserputov  staff   377176 libprocessing.a
    


    또한 make ARCH=arm64를 사용하여 빌드했습니다.



    그리고, 이스라엘에



    이제 테스트할 시간입니다.

    testbin/CmdLineExample.sh
    


    https://github.com/cisco/openh264

    이제 qemu-aarch64로 실행하기만 하면 됩니다.

    결론



    작업하기 좋은 프로젝트이자 코드를 최적화하는 다양한 방법에 대해 배울 수 있는 훌륭한 과정이었습니다.

    교수님, 독자 여러분 감사합니다!

    ⚠️ 컴퓨터 아키텍처 블로그 게시물: 링크

    연결



    🖇 팔로우GitHub

    🖇 팔로우

    _p.s 이 게시물은 SPO600 클래스를 위해 작성되었습니다.

    좋은 웹페이지 즐겨찾기