Я думаю, что у 280Z28 и Christopher ассемблерный гольф покрыт лучше, чем я, и это касается случайного доступа.
Однако то, что вы на самом деле делаете, похоже, обрабатывает целые массивы. Очевидно, по причинам, связанным с кэшированием памяти, вы уже хотите делать это по порядку, если это возможно, поскольку избегание пропуска кэша - это во много-много раз лучшая оптимизация, чем избегание небольшой ветви.
В этом случае, сначала применив подходящую проверку границ, вы можете выполнить внутренний цикл в том, что я буду называть «тире». Убедитесь, что следующие k приращений не приводят к переполнению наименьшего измерения в любом массиве, а затем «разбейте» k шагов, используя новый, еще более внутренний цикл, который просто увеличивает «физический» индекс на 1 каждый раз вместо делать другой идив. Вы или компилятор можете развернуть этот цикл, использовать устройство Даффа и т. Д.
Если ядро маленькое, и особенно если оно имеет фиксированный размер, то это (или кратное число с подходящей разверткой, чтобы иногда вычитать вместо добавления), вероятно, является значением, которое следует использовать для длины "тире" , Постоянная длина тире во время компиляции, вероятно, является лучшей, поскольку тогда вы (или компилятор) можете полностью развернуть цикл дефиса и исключить условие продолжения. Пока это не делает код слишком большим, чтобы быть быстрым, он по существу заменяет всю операцию с положительным модулем целочисленным шагом.
Если ядро не имеет фиксированного размера, но часто очень мало в своем последнем измерении, рассмотрите возможность использования разных версий функции сравнения для наиболее распространенных размеров с полностью развернутой в каждом цикле дефиса.
Другая возможность состоит в том, чтобы вычислить следующую точку, в которой произойдет переполнение (в любом массиве), и затем перейти к этому значению. У вас все еще есть условие продолжения в цикле тире, но оно длится максимально долго, используя только приращения.
В качестве альтернативы, если выполняемая операция представляет собой числовое равенство или какую-либо другую простую операцию (я не знаю, что такое «корреляция»), вы можете посмотреть SIMD-инструкции или что-то еще, в этом случае длина тире должна быть кратные из самых широких сравнений с одной инструкцией (или соответствующей операции SIMD) в вашей архитектуре. Это не то, с чем у меня есть опыт.