Блог пользователя Kenny_HORROR

Автор Kenny_HORROR, 12 лет назад, По-русски

При написании сегодняшнего Codeforces Round #126 и решении задачи A столкнулся с несколько неожиданными поведением. А именно при использовании двумерных массивов размера 2048 x 2048 скорость доступа к данным оказалась на порядок хуже, чем скорость доступа в случае массивов 2048 x 2047 (или 2048 x 2049, или ещё какого-то другого размера) (см. посылки 1829297 и 1830397). Данное поведение оказалось для меня весьма неожиданным (казалось бы наоборот выравнивание данных должно было ускорить доступ). Посему возник вопрос, почему же оно медленее?

  • Проголосовать: нравится
  • +58
  • Проголосовать: не нравится

»
12 лет назад, # |
Rev. 2   Проголосовать: нравится +58 Проголосовать: не нравится

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

upd. http://igoro.com/archive/gallery-of-processor-cache-effects/

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Спасибо за ответ и ссылку. Буду знать в будущем про такую фишку.

  • »
    »
    12 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    Еще в Linux бывает какая-то лажа связанная со страницами памяти, если размеры массивов кратны их размеру. Тоже где-то писали по этому поводу ацмщики на русском.

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится +5 Проголосовать: не нравится

      А откуда вообще операционке знать про размер массивов?

      • »
        »
        »
        »
        12 лет назад, # ^ |
          Проголосовать: нравится +7 Проголосовать: не нравится

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

        • »
          »
          »
          »
          »
          12 лет назад, # ^ |
            Проголосовать: нравится -13 Проголосовать: не нравится

          В том виде, в котором Вы сформулировали это утверждение, оно не может быть верно т.к. никто кроме Вашей программы не знает, какого размера массивы. В частности, массив длиной в одну страницу отличим даже на процессорном уровне фактически неотличим от массива чуть большей длины. У автора поста основная особенность — это доступы к адресам на расстоянии степеней двойки, а не массив длины степени двойки.

          • »
            »
            »
            »
            »
            »
            12 лет назад, # ^ |
            Rev. 2   Проголосовать: нравится +11 Проголосовать: не нравится

            Да, я дурак. Зато Вы очень стройно, ясно и понятно выражаете свои мысли: "В частности, массив длиной в одну страницу отличим даже на процессорном уровне фактически неотличим от массива чуть большей длины".
            Речь не о "размере массива", а о "размерах массива", в частности имеется в виду второе измерение кратное степени двойки, поэтому изменение первого индекса на один приводит к адресу отличающемуся на степень двойки.