Строка/столбец против скорости линейной индексации (пространственное расположение)

Связанный вопрос: Этот

Я использую пространственную сетку, которая потенциально может стать большой (10 ^ 6 узлов) или даже больше. Мне регулярно придется выполнять операции смещения (например, частицу из узла в другой). Я не силен в информатике, но начинаю понимать понятия кэш-строк и пространственной локальности, хотя еще не очень хорошо. Итак, я колебался, предпочтительнее ли использовать 2D-массив (и если да, то какой? Я бы предпочел пока избегать бустинга, но, возможно, я свяжу его позже) и индексировать смещение, например, так:

Массив[i][j] -> Массив[i-1][j+2]

или, с одномерным массивом, если NX является «эквивалентным» количеством столбцов:

Массив[i*NX+j] -> Массив[(i-1)*NX+j+2]

Зная, что это будет сделано почти миллион раз за итерацию, а также почти миллион итераций.


person François Laenen    schedule 14.05.2013    source источник


Ответы (1)


С современными компиляторами и включенной оптимизацией оба они, вероятно, будут генерировать один и тот же код.

Array[i-1][j+2]  // Where Array is 2-dimensional

и

Array[(i-1)*NX+j+2]  // Where Array is 1-dimensional

предполагая, что NX является размером второго нижнего индекса в двумерном массиве (количество столбцов).

person amdn    schedule 15.05.2013
comment
Да, хорошо, но, наверное, это меня и раздражает.. Спасибо! - person François Laenen; 15.05.2013