É possível projetar um compilador que otimiza um loop no qual matrizes são acessadas de maneira alternativa? Por exemplo, assim:
// int[] a,b
int sum = 0;
for(int i = 0; i < n; i++)
{
sum += a[i] + b[i];
}
Com o armazenamento seqüencial usual do array a[i]
e b[i]
podem estar distantes um do outro na memória. Portanto, acho que uma boa otimização do compilador detectaria isso a[i]
e b[i]
sempre será acessada no "mesmo tempo" e armazenaria as matrizes intercaladas, ou seja, a[0] b[0] a[1] b[1] ...
para que um acesso à memória possa recuperar ambos a[i]
e b[i]
.
a[i]
eb[i]
seja recuperado com uma operação de memória, mas eles estavam localizados nas proximidades na memória para melhor desempenho do cache.Respostas:
Foi realizado algum trabalho que corresponde à sua descrição. Por exemplo:
descreve essa otimização.
fonte
A resposta curta nesse caso é que o paralelismo no nível de memória geralmente é suficiente para cobrir vários blocos de memória separados em um loop como esse; intercalar em um único fluxo realmente atrasaria o processo. Muitos algoritmos de armazenamento em cache e memória externa assumem algum grau de paralelismo como este.
A resposta mais longa e mais teórica é que o armazenamento em cache é como vários aspectos da execução do programa que parecem fáceis, mas provam ser difíceis de prever em geral. Por exemplo, um bloco de cache pode precisar ser buscado apenas se um determinado processo parar; um compilador que poderia prever que seria interessante, para dizer o mínimo.
O caso mais simples de otimizar uma sequência conhecida de acessos (sem a necessidade de prever) é por si só difícil:
Petrank e Rawitz, A dureza do posicionamento consciente dos dados em cache
fonte
Seu exemplo não está completo, as matrizes não são declaradas em nenhum lugar, nem são inicializadas em qualquer lugar.
Eu suspeito que, em um contexto geral de programação, esse tipo de otimização seria "mais problemas do que vale a pena". A maioria das matrizes é acessada em mais de um local, portanto, um compilador frequentemente precisa adivinhar qual local é o mais importante. Além disso, muitas matrizes não poderiam ser modificadas dessa maneira porque elas passam sobre as fronteiras da unidade de compilação como parâmetros para funções ou como variáveis globais. Finalmente, tornaria as informações de depuração mais complexas.
fonte