C ++: Melhorando o desempenho do cache em uma matriz 3d
Não sei como otimizar o desempenho do cache em um nível muito baixo, pensando no tamanho da linha de cache ou na associatividade. Isso não é algo que você pode aprender da noite para o dia. Considerando que meu programa será executado em muitos sistemas e arquiteturas diferentes, não acho que valeria a pena. Ainda assim, provavelmente existem algumas etapas que posso executar para reduzir as falhas de cache em gera
Aqui está uma descrição do meu problema:
Tenho uma matriz 3d de números inteiros, representando valores em pontos no espaço, como [x] [y] [z]. Cada dimensão é do mesmo tamanho, então é como um cubo. A partir disso, preciso criar outra matriz 3d, onde cada valor nessa nova matriz é uma função de 7 parâmetros: o valor correspondente na matriz 3d original, mais os 6 índices que "tocam" no espaço. Por enquanto não estou preocupado com as bordas e os cantos do cub
Aqui está o que quero dizer com código C ++:
void process3DArray (int input[LENGTH][LENGTH][LENGTH],
int output[LENGTH][LENGTH][LENGTH])
{
for(int i = 1; i < LENGTH-1; i++)
for (int j = 1; j < LENGTH-1; j++)
for (int k = 1; k < LENGTH-1; k++)
//The for loops start at 1 and stop before LENGTH-1
//or other-wise I'll get out-of-bounds errors
//I'm not concerned with the edges and corners of the
//3d array "cube" at the moment.
{
int value = input[i][j][k];
//I am expecting crazy cache misses here:
int posX = input[i+1] [j] [k];
int negX = input[i-1] [j] [k];
int posY = input[i] [j+1] [k];
int negY = input[i] [j-1] [k];
int posZ = input[i] [j] [k+1];
int negZ = input[i] [j] [k-1];
output [i][j][k] =
process(value, posX, negX, posY, negY, posZ, negZ);
}
}
No entanto, parece que, se o COMPRIMENTO for grande o suficiente, receberei toneladas de erros de cache quando estou buscando os parâmetros paraprocess
. Existe uma maneira mais amigável de fazer isso, ou uma maneira melhor de representar meus dados que não seja uma matriz 3d?
E se você tiver tempo para responder a essas perguntas extras, tenho que considerar o valor do COMPRIMENTO? Como se fosse diferente se LENGTH é 20 vs 100 vs 10000. Além disso, eu precisaria fazer outra coisa se usasse algo diferente de números inteiros, como talvez uma estrutura de 64 byte
@ ildjarn:
Desculpe, não achei que o código que gera as matrizes que estou passando paraprocess3DArray
importava. Mas, se houver, gostaria de saber o porquê.
int main() {
int data[LENGTH][LENGTH][LENGTH];
for(int i = 0; i < LENGTH; i++)
for (int j = 0; j < LENGTH; j++)
for (int k = 0; k < LENGTH; k++)
data[i][j][k] = rand() * (i + j + k);
int result[LENGTH][LENGTH][LENGTH];
process3DArray(data, result);
}