비동기 HLO 명령

  1. HLO에 비동기 작업을 추가하는 것은 번거롭습니다 (예: all-reduce-startall-reduce-done).
  2. 일부 비동기식 사용의 경우 시작 및 완료 분할이 부적절할 수 있습니다. 있습니다.

첫 번째 단점을 공략하기 위해 마지막 한 세트를 도입하는 것이 좋습니다. 비동기 명령 코드: kAsyncStart, kAsyncUpdatekAsyncDone. 아이디어 모든 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-startasync-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” 명령 코드를 사용합니다.