Если вы оптимизируете архитектуру, на которой ветвление стоит дорого (скажем, процессор ячеек PS3), может быть важно определить, можете ли вы выражать данный алгоритм без использования ветвей или, по крайней мере, с использованием меньшего количества ветвей , Один шаблон, который я вижу много в неоптимизированном коде, - это куча if, используемая для настройки индекса в некоторый массив (если размер массива нечетный, bump индекс на 1, при некоторых других обстоятельствах умножайтесь на 2 и т. Д.). Так что было бы неплохо, если бы был способ, учитывая два списка чисел, чтобы определить, можно ли написать функцию без разбиения, превращая один список в другой.Методика определения, можно ли генерировать целую последовательность без ветвей?
Например, я недавно хотел узнать, можно ли написать ветвящуюся функцию, которая преобразует: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
в: 0, 2, 4, 6, 8, 9, 7, 5, 3, 1
(по возрастанию, а затем по убыванию). Технически я мог бы написать большую функцию switch/case, но, очевидно, меня интересует функция, которая будет следовать шаблону для произвольных размеров. Написание функции для выполнения этого преобразования является прямым с ветвлением, но если есть способ неважно, это не сразу становится очевидным.
Итак, существует ли общий подход к этой проблеме или какой-либо тест быстрой лакмусовой бумажки? Или вам нужно придумывать доказательства на индивидуальной основе? Я мог бы усердно работать над такими проблемами, но это бессмысленно, если они буквально невозможны. В какой-то момент я, похоже, вспоминаю, что есть формальное математическое слово для функций, которые используют арифметику без ветвления, но я не могу вспомнить.
Без разветвления? Означает ли это, что функция будет выполнять точно такую же последовательность примитивных операций над любым аргументом? Или вам разрешено делать такие вещи, как «читать значение n, а затем перейти к n-му элементу ...»? В первом случае это совершенно очевидно, но в последнем случае это просто утомительно. Или вы имеете в виду что-то еще? – Beta
Я имею в виду условные обозначения и результирующие инструкции перехода. «Переход к значению n» может падать в этой категории в зависимости от того, что вы имеете в виду. Если вы имеете в виду вызов указателя функции, который индексируется n в массиве, это считается ветвлением. Если вы имеете в виду чтение n откуда-то, то используйте его для индексации массива, который не требует какого-либо ветвления. В принципе нет экземпляров «если это правда, иди так или иначе иди так» (обратите внимание, что в этом определении подсчитываются условные выражения цикла). –
Я не должен понимать проблему, потому что похоже, что будет работать индексирование прямого массива. 'J = A [I]' Если вы хотите сделать это над целым массивом, а не только с одним номером, вы можете развернуть цикл или использовать устройство Даффа, чтобы уменьшить стоимость ветвления. –