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);
}

questionAnswers(4)

yourAnswerToTheQuestion