Динамические постоянные выражения и Единый поток управления

Некоторые операции требуют, что бы выражение было динамически постоянным (dynamically uniform), или что бы находилось в единый поток управления (uniform control flow) (uniform – единый, постоянный, однообразный). Эти требования определяются следующим набором определений.

Invocation (Вызов) является единственным способом выполнить main() для конкретного этапа, работающий только с набором данных, явно указанных в шейдерах данного этапа. (Любая неявная операция по дополнительным экземпляров данных будет содержать дополнительные вызовы.) Например, в моделях выполнения вычислений, одиночный вызов оперирует только с одним рабочим элементом, или же, в вычисления вершин, за один вызов обрабатывается только одна вершина.

Вызываемая группа (invocation group) – это полный набор вызовов, совместно обрабатывающих конкретную вычислительную рабочую группу или графическую группу, где область действия «графической операции» зависит от реализации, но не менее одного одного треугольника или патча, но не более одной команды рендеринга, как указано в клиентском API.

В рамках одного вызова один оператор шейдера может быть выполнен несколько раз, предоставляя несколько динамических экземпляров (dynamic instances) этой инструкции (оставляю дословный перевод «instruction», но возможно более подходящим было бы «команды»). Это может произойти, когда инструкция выполняется в цикле или в функции, вызываемой из нескольких мест, или комбинация вышеперечисленного. Различные итерации цикла и различные динамические цепочки вызовов функций дают различные динамические экземпляры такой инструкции. Динамические экземпляры различаются по пути своего потока управления в вызове, а не потому, какой вызов выполнил его. Т.е. разные вызовы main() исполняют те же динамические экземпляры инструкции, когда они следуют по одному пути потока управления.

Выражение является динамической постоянной (dynamically uniform) для  динамического экземпляра, когда его значение аналогично для всех вызовов (в вызываемой группе), выполняемых данным динамическим экземпляром.

Единый поток управления (Uniform control flow) (или сходящийся поток управления) возникает/встречается, когда все вызовы в вызываемой группе выполняют один и тот же путь потока управления (и, следовательно, одну и ту же последовательность динамических экземпляров инструкций). Единый поток управления длится от входа в main() и до разделения пути управления разных вызовов каким-то условием. Такая дивергенция может изменить путь, при это все вызовы однажды будут снова выполнять один путь потока управления, это восстановление единого потока управления. Если поток управления является единым при входе в цикл, и все вызовы в группе вызовов впоследствии покинут этот цикл или выбор, тогда поток управления станет единым.

К примеру:

main()
{
float a = …;// это Единый поток управления
if (a < b) { // Это выражение истинно не всегда
….; // Не-Единый поток управления
} else {
….; // Не-Единый поток управления
}
….; // снова Единый поток управления
}

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

Main Admin

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *