Одна из теорий заключается в том, что тестирование на ноль быстрее, чем тестирование на j<m
. Так что с помощью цикла от j=m
до j>0
теоретически вы можете сэкономить несколько наносекунд на цикл. Однако, как показал недавний опыт, это не имеет для меня никакого значения, поэтому я думаю, что это не относится к текущим процессорам.
Другая проблема связана с разметкой памяти: если ваш внутренний цикл обращается к фрагменту памяти, который не распределен, но непрерывен, скорее всего, у вас будет больше преимуществ от самого низкого кеша, доступного в вашем ЦП.
В вашем текущем примере может помочь переключение раскладки w
с w[j][i]
на w[i][j]
. Также поможет выравнивание ваших значений на границах 4 или 8 байтов (но вы обнаружите, что это уже относится к вашим массивам)
Другой - это циклическое развертывание, означающее, что вы выполняете свой внутренний цикл кусками, скажем, 4. Таким образом, оценка, если цикл выполнен, должна выполняться в 4 раза меньше. Оптимальное значение должно быть определено эмпирически, а также может зависеть от рассматриваемой проблемы (например, если вы знаете, что цикл повторяется 5 раз, используйте 5)