Pisanie testów jednostkowych dla przejść HLO

Testy jednostkowe dla przejść HLO można pisać na różne sposoby. Na tej stronie opisujemy preferowaną metodę zapewniającą spójność i czytelność.

FileCheck z przeplatanymi liniami CHECK

Większość przejść HLO można przetestować za pomocą testów FileCheck. W tekstach modułu HLO wejściowego przeplataj wiersze CHECK i pamiętaj, aby konsekwentnie używać // CHECK zamiast ; CHECK jako ogranicznika FileCheck.

Możesz na przykład zmienić fusion cc_test na priotity_fusion w ten sposób:

TEST_F(PriorityFusionTest, FuseBroadcastIntoBitcastConsumers) {
  absl::string_view kHlo = R"(
    HloModule test_module

    // CHECK: ENTRY main
    ENTRY main {
      // CHECK-NEXT: %[[PARAM:.*]] = f32[96]{0} parameter(0)
      param_0 = f32[96]{0} parameter(0)
      broadcast = f32[8,96,128,7]{3,2,1,0} broadcast(param_0), dimensions={1}
      bitcast.6079.2 = f32[8,24,4,128,7]{4,3,2,1,0} bitcast(broadcast)
      // CHECK-NEXT: ROOT %{ {.*} } fusion(%[[PARAM]]) { {.*} }
      ROOT transpose.1990.2 = f32[8,24,128,7,4]{4,3,2,1,0} transpose(bitcast.6079.2), dimensions={0,1,3,4,2}
    }
  )";
  RunAndFilecheckHloRewrite(kHlo, std::move(priority_fusion_));
}

LIT runner i hlo-opt

W miarę możliwości używaj LIT runner i hlo-opt oraz umieszczaj wiersze CHECK lokalnie obok odpowiadających im danych wejściowych IR. Pamiętaj, aby jako separatora używać znaku // CHECK zamiast ; CHECK.

Na przykład niektóre testy GPU można napisać w ten sposób:

// RUN: hlo-opt %s --platform=gpu --stage=llvm-before-optimizations --xla_gpu_target_config_filename=%S/../../../backends/gpu/specs/%{GPU}.txtpb | FileCheck --check-prefixes=CHECK-%{PTX} %s

HloModule Test, is_scheduled=true
fused_computation {
  param_0 = f32[100,200]{1,0} parameter(0)
  ROOT b.1 = f32[200,100]{1,0} transpose(f32[100,200]{1,0} param_0), dimensions={1,0}
}
ENTRY main {
  a = f32[100, 200]{1,0} parameter(0)
  // CHECK-PTX:         call void @llvm.nvvm.barrier0
  // CHECK-GCN:         call void @llvm.amdgcn.s.barrier
  ROOT wrapped_b = f32[200,100]{1,0} fusion(f32[100,200]{1,0} a), kind=kInput, calls=fused_computation
}

Automatyczny skrypt generowania CHECK

Ręczne sprawdzanie testów pisania może być bardzo pracochłonne, dlatego często bardziej praktyczne jest uruchomienie optymalizatora, przejrzenie wyników, aby upewnić się, że są zgodne z oczekiwaniami, a następnie przekształcenie zoptymalizowanego HLO w CHECK dyrektywy. Aby uprościć ten proces, możesz użyć generate_hlo_test_checks.py, aby automatycznie wstawiać wygenerowane dyrektywy CHECK nad każdym przypadkiem testowym w pliku HLO.

(Nie) Przechodzenie po grafie

Unikaj pisania testów, które przechodzą przez węzły liściowe wykresu wyników i pasują do oczekiwanej operacji. Pisanie takich testów jest żmudne, trudno je szybko odczytać, a jeszcze trudniej debugować i naprawiać. Zamiast tego użyj jednej z powyższych opcji.