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
имело значение. Но если это произойдет, я хотел бы знать, почему.
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);
}