Рубрики

Выполнение циклов (вопрос кеширования)

Ниже рассмотрим две функции языка Си для вычисления суммы элементов в двумерном массиве. Не обращая внимания на оптимизацию компилятора, какая из двух является лучшей реализацией суммы?

// Функция 1

int fun1(int arr[R][C])

{

    int sum = 0;

    for (int i=0; i<R; i++)

      for (int j=0; j<C; j++)

          sum += arr[i][j];

}

  
// Функция 2

int fun2(int arr[R][C])

{

    int sum = 0;

    for (int j=0; j<C; j++)

      for (int i=0; i<R; i++)

          sum += arr[i][j];

}

В C / C ++ элементы хранятся в порядке Row-Major. Таким образом, первая реализация имеет лучшую пространственную локальность (соседние области памяти упоминаются в последовательных итерациях). Поэтому первая реализация всегда должна быть предпочтительной для итерации многомерных массивов.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Выполнение циклов (вопрос кеширования)

0.00 (0%) 0 votes