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.
As aulas podem ser lidas gratuitamente. Inscreva-se para salvar o progresso.
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.