- HLO에 비동기 작업을 추가하는 것은 번거롭습니다 (예:
all-reduce-start
및all-reduce-done
). - 일부 비동기식 사용의 경우 시작 및 완료 분할이 부적절할 수 있습니다. 있습니다.
첫 번째 단점을 공략하기 위해 마지막 한 세트를 도입하는 것이 좋습니다.
비동기 명령 코드: kAsyncStart
, kAsyncUpdate
및 kAsyncDone
. 아이디어
모든 HLO 명령을 래핑할 수 있는 일반적인 비동기 명령 코드를 생성하는 것입니다.
비동기식으로 수행되는 실제 작업은
명령을 루트로 하고
매개변수입니다. 진행 중인 입출력 버퍼 처리 및 앨리어싱
모든 비동기 작업에 공유될 수 있습니다. async-start 명령어의
출력 셰이프는 입력 피연산자, 출력 값 및
async-update
또는 async-done
에 필요한 중간 상태
참조하세요.
%async_op {
%param0 = f32[64] parameter(0)
ROOT %op = f32[32] op(f32[64] %param0), op_specific_attr=”foo”
}
%async-start = (f32[64], f32[32], s32[]) async-start(f32[64] %operand),
calls=%async_op
%async-done = f32[32] async-done((f32[64], f32[32], s32[]) %async-start)
위의 표현에서는 async-start
만 호출된 계산을 갖습니다.
피연산자에 따라 async-done
의 기능을 찾는 것은 간단합니다.
상응하는 async-start
를 찾아 호출된 계산을 찾습니다.
추가 참고사항
async-start
별칭의 출력 튜플에 있는 첫 번째 요소가
피연산자이므로 버퍼는 최소한 async-done 명령이 나올 때까지 활성 상태로 유지됩니다.
마찬가지로 출력이 async-done
인 두 번째 요소 별칭 및
세 번째 요소는
비동기 작업을 지원합니다 이 표현은 또한
비동기 작업 입력 및/또는 출력과 앨리어싱이 동일하게 작동합니다.
다음과 같습니다.
%async_op {
%param0 = f32[64] parameter(0)
%param1 = f32[64] parameter(1)
ROOT %op = (f32[32], f32[32]) op(f32[64] %param0, f32[64] %param1),
op_specific_attr=”foo”
}
%async-start = ((f32[64], f32[64]), (f32[32], f32[32]), s32[])
async-start(f32[64] %operand0, f32[64] %operand1),
calls=%async_op
%async-done = (f32[32], f32[32]) async-done(%async-start)
또한 이 작업은 0개 이상의 async-update
로 추가로 분해할 수 있습니다.
단계들입니다. 입력/출력 앨리어싱은
async-update
명령어와 각 async-start
및
async-update
안내에는 사용자가 둘 중 한 명이어야 합니다.
async-update
또는 async-done
:
%async_op {
%param0 = f32[64] parameter(0)
ROOT %op = f32[32] op(f32[64] %param0), op_specific_attr=”foo”
}
%async-start = (f32[64], f32[32], s32[]) async-start(f32[64] %operand),
calls=%async_op
%async-update0 = (f32[64], f32[32], s32[]) async-update(
(f32[64], f32[32], s32[]) %async-start)
%async-update1 = (f32[64], f32[32], s32[]) async-update(
(f32[64], f32[32], s32[]) %async-update0)
%async-done = f32[32] async-done((f32[64], f32[32], s32[]) %async-update1)
구문 슈가
인코더가 될 연산을 정의하기 위한 별도의 계산이 있기 때문에 조금 번거롭지만, 구문 슈가를 제안하여 비동기 작업을 최고 수준의 클래스인 것처럼 자동으로 출력하고 파싱합니다. opcode입니다. 접미어 '-start', '-update', '-done'을 처리하는 방식 특히 컴퓨팅과 명령을 자동으로 생성하는 방식으로 접미사)을 사용합니다. 예를 들어 위의 코드 스니펫은 두 가지를 동일한 표현으로 파싱할 수 있습니다.
%op-start = (f32[64], f32[32], s32[]) op-start(f32[64] %operand),
op_specific_attr=”foo”
%op-update0 = (f32[64], f32[32], s32[]) op-update(
(f32[64], f32[32], s32[]) %op-start),
op_specific_attr=”foo”
%op-update1 = (f32[64], f32[32], s32[]) op-update(
(f32[64], f32[32], s32[]) %op-update0)
%op-done = f32[32] op-done((f32[64], f32[32], s32[]) %op-update1)
모호성을 야기하지 않기 위해 인증기는
명령 코드를 명시적으로 정의한 경우 async-start로 래핑되어야 합니다.
작업을 시작할 수 있습니다. 이것은 또한 탈출 수단이기도 합니다.
HLO 수준 치료가 필요한 지침이 있는 경우
위에 설명된 모델에 맞지 않는 경우 (예: 앨리어싱 입력/출력
생성합니다. 따라서 처음에는 copy-start
/copy-done
입니다.
collective-permute-start
/collective-permute-done
등)은
각 퍼스트 클래스 명령 코드를 새 코드 대신
Google이 코드를 정리하여 이를 삭제할 때까지 명령 코드 async-start
/async-done
개
“-start”/”-done” 명령 코드를 사용합니다.