C ++: повышение производительности кэша в трехмерном массиве

Я не знаю, как оптимизировать производительность кеша на действительно низком уровне, думая о размере строк кеша или об ассоциативности. Это не то, что вы можете узнать за одну ночь. Учитывая, что моя программа будет работать на разных системах и архитектурах, я не думаю, что это все равно будет того стоить. Но, тем не менее, есть некоторые шаги, которые я могу предпринять, чтобы уменьшить потери кеша в целом.

Вот описание моей проблемы:

У меня есть трехмерный массив целых чисел, представляющих значения в точках пространства, например [x] [y] [z]. Каждое измерение имеет одинаковый размер, поэтому это как куб. Из этого мне нужно сделать еще один 3d-массив, где каждое значение в этом новом массиве является функцией 7 параметров: соответствующее значение в исходном 3d-массиве плюс 6 индексов, которые «касаются» его в пространстве. Я не беспокоюсь о краях и углах куба на данный момент.

Вот что я имею в виду в коде 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);
            }
}

Тем не менее, кажется, что если LENGTH достаточно велик, я получу тонны кеша при получении параметров дляprocess, Есть ли более удобный для кеша способ сделать это или лучший способ представить мои данные, кроме трехмерного массива?

И если у вас есть время, чтобы ответить на эти дополнительные вопросы, нужно ли мне учитывать значение ДЛИНЫ? Как будто по-другому, LENGTH 20 против 100 против 10000. Кроме того, я должен был бы сделать что-то еще, если бы я использовал что-то другое, чем целые числа, как, например, 64-байтовую структуру?

@ ildjarn:

Извините, я не думал, что код, который генерирует массивы, в которые я передаюprocess3DArray&nbsp;имело значение. Но если это произойдет, я хотел бы знать, почему.

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