Altifigence Academy

13 / 20 · Conceito

Divisão em blocos e preenchimento das bordas

Mapeie matrizes maiores para uma grade menor e trate o preenchimento com zeros e as máscaras de saída.

Divida primeiro o espaço da saída

Uma grade N×N trata um resultado M×P maior usando ceil(M/N)×ceil(P/N) blocos espaciais. Nossa configuração básica mantém toda a redução K em cada bloco e limpa entre blocos de saída. O módulo envolvente armazena a origem r0,c0 do bloco; o PE(i,j) local mapeia para o C(r0+i,c0+j) global. A defasagem depende das coordenadas locais.

Considere N=2 e M=P=K=3. Sejam A=[[1,2,3],[4,5,6],[7,8,9]] e B=[[1,0,2],[0,1,0],[2,0,1]]. Seu produto é [[7,2,5],[16,5,14],[25,8,23]]. As quatro origens dos blocos são (0,0), (0,2), (2,0) e (2,2).

Preencha operandos, mas masque as escritas

Forneça linhas de A e colunas de B fora da faixa como tokens zero válidos. Cada PE ainda consome K termos, preservando o contrato simples de conclusão. Invalidar os termos de preenchimento pode, em vez disso, deixar algumas contagens abaixo de K para sempre. Separadamente, masque as escritas dos resultados para impedir escritas fora da matriz real.

O bloco final usa A=[[7,8,9],[0,0,0]] e B=[[2,0],[0,0],[1,0]]. Seu resultado local é [[23,0],[0,0]], mas apenas o valor superior esquerdo pode ser escrito em C(2,2). Um zero numérico não torna seguro um endereço fora da faixa.

Cada bloco usa cinco bordas com advance, totalizando vinte para quatro blocos sequenciais, excluindo clear, carregamento e transferência da saída. A grade executa quarenta e oito MACs incluindo preenchimento; apenas vinte e sete pertencem ao produto real 3×3.

Dividir a redução exige manter as somas

Dividir K exige combinar somas parciais para a mesma saída. C(0,0)=1×1+2×0+3×2=7 divide-se nas parciais um e seis para K=2+1. Limpar o acumulador final entre essas reduções deixa apenas seis. Mantenha o acumulador ou combine somas parciais amplas em outro lugar. Quantizar cada parcial antes da combinação pode diferir de quantizar uma única vez a soma completa.

O projeto final começa com blocos espaciais e K completo. Teste bordas de um elemento, dimensões divisíveis por N, um bloco final com uma única saída real, zeros válidos de preenchimento e máscaras de saída. Use coordenadas globais como chaves do scoreboard de referência para que mudar a ordem dos blocos não altere o resultado esperado.

Experimente

Para o bloco (0,2) no exemplo 3×3, forneça a máscara de saída e o resultado local. Quais são as somas parciais de C(0,2) quando K se divide em 2+1?

Ler a explicação

O resultado local é [[5,0],[14,0]] e a máscara é [[1,0],[1,0]]. C(0,2)=1×2+2×0+3×1 tem somas parciais dois e três, totalizando cinco.

Sua escolha vale neste navegador. Altere-a a qualquer momento no rodapé.