CANN/asc-devkit ReduceAll 연산자 API 가이드

asc-devkit는 CANN에서 제공하는 Ascend AI 프로세서 전용 연산자 프로그램 개발 도구입니다. C 및 C++ 표준을 지원하며, 라이브러리와 언어 확장 계층으로 구성되어 다차원 시나리오의 연산자 개발 요구사항을 충족하는 다계층 API를 제공합니다. 프로젝트 주소: https://gitcode.com/cann/asc-devkit

지원 제품

제품 지원 여부
Ascend 950PR/Ascend 950DT
Atlas A3 훈련/추론 시리즈
Atlas A2 훈련/추론 시리즈
Atlas 200I/500 A2 추론 제품 x
Atlas 추론 시리즈 AI Core x
Atlas 추론 시리즈 Vector Core x
Atlas 훈련 시리즈 x

기능 설명

지정된 차원에서 다차원 벡터에 대해 논리적 AND 연산을 수행합니다. 지정된 연산 차원을 'Reduce 축(R축)'이라 하고, 지정되지 않은 차원을 'Normal 축(A축)'이라 합니다. 예를 들어, shape가 (2, 3)인 2차원 행렬에 대해 연산을 수행할 때, 첫 번째 차원을 Reduce 축으로 지정하면 결과는 [1, 0, 0]이 됩니다. 마지막 차원을 Reduce 축으로 지정하면 결과는 [0, 0]이 됩니다.

그림 1 ReduceAll 첫 번째 차원 연산 예시

ReduceAll 첫 번째 차원 연산 예시

그림 2 ReduceAll 마지막 차원 연산 예시

ReduceAll 마지막 차원 연산 예시

함수 원형

  • sharedTmpBuffer 파라미터를 통해 임시 공간 전달:
    template <class T, class pattern, bool isReuseSource = false>
    __aicore__ inline void ReduceAll(const LocalTensor<T>& dstTensor, const LocalTensor<T>& srcTensor, const LocalTensor<uint8_t>& sharedTmpBuffer, const uint32_t srcShape[], bool srcInnerPad)
  • 인터페이스 프레임워크에서 임시 공간 할당:
    template <class T, class pattern, bool isReuseSource = false>
    __aicore__ inline void ReduceAll(const LocalTensor<T>& dstTensor, const LocalTensor<T>& srcTensor, const uint32_t srcShape[], bool srcInnerPad)

이 인터페이스는 복잡한 수학 계산으로 인해 중간 변수를 저장하기 위한 추가 임시 공간이 필요합니다. 임시 공간은 개발자가 sharedTmpBuffer 파라미터를 통해 직접 전달하거나, 인터페이스 프레임워크가 자동으로 할당하도록 할 수 있습니다.

  • 직접 전달: 개발자가 sharedTmpBuffer 텐서를 할당하여 임시 공간으로 사용합니다. 인터페이스 프레임워크는 추가 공간을 할당하지 않습니다. 이 방식을 사용하면 개발자가 sharedTmpBuffer 메모리를 직접 관리하고, 인터페이스 호출 후 해당 메모리를 재사용할 수 있어 메모리 할당/해제 오버헤드를 줄이고 메모리 활용도를 높일 수 있습니다.
  • 프레임워크 할당: 개발자는 임시 공간을 할당할 필요가 없지만, 필요한 임시 공간 크기를 미리 확보해야 합니다.

sharedTmpBuffer를 직접 전달하는 경우, 개발자는 해당 텐서의 공간을 할당해야 합니다. 프레임워크가 할당하는 경우, 개발자는 필요한 임시 공간 크기를 미리 계산해야 합니다. 필요한 임시 공간 크기는 GetReduceAllMaxMinTmpSize 함수를 통해 얻을 수 있습니다.

파라미터 설명

템플릿 파라미터

파라미터명 설명
T 피연산자의 데이터 타입. uint8_t, float를 지원합니다.
pattern ReduceAll 계산 축을 지정합니다. Reduce 축(R)과 Normal 축(A)으로 구성됩니다. pattern은 벡터 차원 수와 동일한 'A'와 'R' 문자의 조합으로 이루어집니다. 예를 들어, 'AR'은 2차원 벡터에 대한 ReduceAll 연산을 나타내며, 첫 번째 차원은 Normal 축, 두 번째 차원은 Reduce 축으로, 즉 두 번째 차원 데이터에 대해 논리적 AND 연산을 수행합니다. patternAscendC::Pattern::Reduce 네임스페이스에 정의된 구조체이며, 사용자 정의가 필요하지 않습니다. 현재 'AR'과 'RA'만 지원하며, 사용자는 명시적으로 AscendC::Pattern::Reduce::AR 또는 AscendC::Pattern::Reduce::RA를 지정해야 합니다.
isReuseSource 소스 피연산자 수정을 허용할지 여부입니다. 기본값은 false입니다. 소스 피연산자 수정이 허용되면 일부 메모리 공간을 절약할 수 있습니다. true로 설정하면 인터페이스 내부 계산 시 src 메모리 공간을 재사용하여 메모리를 절약합니다. false로 설정하면 src 메모리 공간을 재사용하지 않습니다. isReuseSource 사용 예시는 추가 예제에서 확인할 수 있습니다.

인터페이스 파라미터

파라미터명 입력/출력 설명
dstTensor 출력 목적 피연산자. LocalTensor 타입이며, VECIN/VECCALC/VECOUTTPosition을 지원합니다.
srcTensor 입력 소스 피연산자. LocalTensor 타입이며, VECIN/VECCALC/VECOUTTPosition을 지원합니다. 소스 피연산자의 데이터 타입은 목적 피연산자와 일치해야 합니다.
sharedTmpBuffer 입력 임시 버퍼. LocalTensor 타입이며, VECIN/VECCALC/VECOUTTPosition을 지원합니다. ReduceAll 내부 복잡한 계산 시 중간 변수를 저장하기 위해 개발자가 제공합니다. 임시 공간 크기(BufferSize)는 GetReduceAllMaxMinTmpSize를 참조하십시오.
srcShape 입력 소스 피연산자의 shape 정보를 나타내는 uint32_t 타입의 배열입니다. 이 shape의 차원은 템플릿 파라미터 pattern의 차원과 일치해야 합니다. 현재 2차원 shape만 지원합니다. 예를 들어, pattern이 'AR'이면, shape는 반드시 2차원이어야 합니다.
srcInnerPad 입력 실제 계산해야 하는 가장 안쪽 축 데이터가 32바이트 정렬되었는지 여부를 나타냅니다. 현재 true만 지원합니다.

반환값

없음

제약 조건

  • 피연산자 주소 정렬 요구사항은 일반 주소 정렬 제약 조건을 참조하십시오.
  • 소스 피연산자 srcTensor의 입력 데이터는 0 또는 1만 허용됩니다.
  • 소스 피연산자와 목적 피연산자의 주소 중첩을 지원하지 않습니다.
  • sharedTmpBuffer와 소스/목적 피연산자의 주소 중첩을 지원하지 않습니다.

호출 예시

// dstLocal: 출력 결과
// srcLocal: 입력 데이터
// tmp: 중간 결과 저장을 위한 임시 공간
// shape: 입력 데이터의 shape 정보, 현재 2차원만 지원
uint32_t shape[] = { 2, 8 };
// isReuse: 소스 피연산자 srcLocal 수정 허용 여부, true - 허용, false - 미허용
constexpr bool isReuse = true;
// 마지막 축에 대해 논리적 AND 연산 수행
AscendC::ReduceAll<float, AscendC::Pattern::Reduce::AR, isReuse>(dstLocal, srcLocal, tmp, shape, true);

결과 예시

입출력 데이터 타입: float
입력 데이터 (src):
[[ 0.0 1.0 1.0 0.0 1.0 0.0 1.0 1.0],
 [ 0.0 1.0 0.0 1.0 0.0 1.0 1.0 0.0]]
입력 pattern: AR
입력 shape: (2,8)
출력 데이터 (dst): [0.0 0.0]

태그: CANN asc-devkit ReduceAll Ascend AI

8월 19일 18:36에 게시됨