Neste documento, resumiremos as diretrizes para implementar e revisar uma operação do intérprete. Incluímos intencionalmente alguns itens de ação auxiliar relacionados ao verificador e à inferência de tipo, com a ideia de progredir nessas frentes junto com a implementação do intérprete.
Ao implementar a operação
- Forneça uma estratégia de teste explicitamente escrita (em uma descrição de RP) semelhante a esta para usar como referência ao revisar os métodos de verificação e inferência de tipo e os testes correspondentes. O revisor vai verificar se a descrição está completa.
- Consulte hlo_evaluator para identificar detalhes complicados da implementação e possíveis lacunas de funcionalidade.
- Registre tíquetes para os componentes de software correspondentes se você encontrar bugs ou funcionalidades ausentes.
Depois de implementar a operação
Em StablehloOps.td:
- Verifique se o
summary
no ODS da operação segue o formato padrão. (ticket relacionado) Adicione comentários que referenciam rótulos de restrição (por exemplo,
Cn
ouIn
) da especificação no formatoxyz_cn
ouxyz_in
, na operaçãoXyzOp
, para identificar a correspondência entre as restrições no ODS e a especificação. O exemplo a seguir mostra como adicionar os rótulos de restrição como comentários ao lado deTraits
eTypeConstraints
de mlir.xyz_c4
se refere a restrições definidas na classeStableHLO_FooOp
(por exemplo,StableHLO_ShapedInterfaceOp
,StableHLO_UnaryElementwiseOp
,StableHLO_Op
etc.).def StableHLO_XyzOp: StableHLO_FooOp<"xyz", [Trait1, Trait2 /*xyz_c1, xyz_c2*/, InferTensorType /*xyz_c3*/]> { /*xyz_c4*/ ... let summary = "Xyz operation"; let arguments = (ins 1DTensorOf<[HLO_Float]>:$a, /*xyz_c5, xyz_i1*/ HLO_Tensor:$b, /*xyz_i2*/ .... ); );
- Verifique se o
Em TypeInference.cpp e StablehloOps.cpp:
- Exclua comentários como "Verifique as seguintes propriedades: ...".
- Adicione comentários que referenciam rótulos de restrição (por exemplo,
Cn
ouIn
) da especificação no formatoxyz_cn
ouxyz_in
, para a opXyzOp
, para identificar quais partes dos verificadores e funções de forma correspondem a quais restrições na especificação.- Não há problema em ter um comentário com vários rótulos de restrição ou
vários comentários com o mesmo rótulo de restrição. Tudo depende de
como as restrições são implementadas. Se houver restrições consecutivas,
condene-as como
xyz_cn...xyz_cm, xyz_in...xyz_jn
. - Caso haja uma incompatibilidade entre as restrições na implementação em relação às da especificação, verifique se há um problema aberto que reflita essa discrepância.
- Não há problema em ter um comentário com vários rótulos de restrição ou
vários comentários com o mesmo rótulo de restrição. Tudo depende de
como as restrições são implementadas. Se houver restrições consecutivas,
condene-as como
-
- Adicione um arquivo com o nome
interpret_<op_mnemonic>.mlir
. - Crie testes seguindo as diretrizes de teste.
- Adicione um arquivo com o nome
-
- Execute todos os testes desativados que foram cobertos pela nova operação.
- Se os testes forem aprovados, ative-os convertendo
RUN-DISABLED
emRUN
. - Se um teste falhar por algum motivo que não seja incompatibilidade de precisão, corrija a implementação/teste.
- Para incompatibilidades de precisão, marque o teste com
RUN-DISABLED(#1278)
(se isso ainda não tiver sido feito).
-
- Confira se há pelo menos um teste (positivo ou negativo) para cada restrição nos métodos de inferência de tipo e verificador. As restrições cobertas no ODS não serão testadas. Esses testes serão, na maioria das vezes, negativos, testando se as restrições não foram atendidas ou positivos, testando se a forma inferida está correta.
- Confira se todos os testes relacionados à operação em teste foram colocados juntos.
- Verifique se todos os testes relacionados à operação em teste são
preparados com uma macro acesa
CHECK-LABEL
. - Escolha o nome da função dos testes usando o formato
xyz_cn_im_...
para uma restrição de teste de funçãoCn
,Im
etc. para a operaçãoXyzOp
. Nos casos em que o formato proposto não for aplicável, mantenha o nome atual. - Depois de concluir a etapa acima, classifique todos os testes relacionados à operação em teste em ordem alfabética com base no nome da função.
- Continue adicionando testes até que o ccov mostre >= 90% de cobertura para a operação.
-
- Confira se todas as restrições relacionadas aos testes de inferência de formas estão presentes nesse arquivo, seguindo as mesmas diretrizes de nomenclatura indicadas acima.
- Mova todos os testes de inferência de forma do ops_stablehlo.mlir para esse arquivo.
Em spec.md:
- Adicione um link para
interpret_<op_mnemonic>.mlir
à seção "Exemplos" (por exemplo, Mais exemplos). - A especificação precisa ter apenas um exemplo.
- Confira se o exemplo de especificação segue as diretrizes de teste.
- Verifique se o teste do exemplo de especificação é interpretável.
- Confira se o exemplo de especificações é o mesmo do ODS.
- Adicione um link para
Em status.md:
- Atualize a coluna "Intérprete" para
yes
.
- Atualize a coluna "Intérprete" para