Развертка цикла и черепица

Может кто-нибудь рассказать, являются ли 2 метода оптимизации одинаковыми или разными?

Кроме того, ответственность за это программист или компилятор?

Ответы

Ответ 1

Оба метода отличаются друг от друга. См. Описания для Loop unrolling и Loop tiling.

Прокрутка цикла выполняется для устранения накладных расходов на цикл. Он (обычно) полезен только для довольно маленьких циклов, где число итераций невелико и известно во время компиляции. В основном это делается компилятором.

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

Плитка петли обычно выполняется с очень большими наборами данных. Объект: загрузить некоторые данные в кэш-память и выполнить все операции над ним перед поиском в некоторых новых данных.

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

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

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

Ответ 2

Это две совершенно разные оптимизации производительности.

Loop unrolling - это оптимизация кода, где код реплицируется в цикле, и общее число итераций цикла уменьшается. Преимуществом является сокращение накладных расходов на контур (как правило, только для очень маленьких циклов) и более эффективное планирование команд с уменьшенными стойками зависимостей в суперскалярных процессорах. Это можно сделать как вручную, так и/или в качестве оптимизации компилятора.

Tiling - оптимизация памяти, целью которой является более эффективное использование кеша путем обработки фрагментов (небольших блоков в большей структуре данных), как правило, в контексте изображения или другой структуры 2D-данных. Обычно это выполняется на уровне исходного кода, как часть общей реализации алгоритма.