Разматывание петли против черепичной петли - PullRequest
16 голосов
/ 26 марта 2011

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

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

Ответы [ 2 ]

23 голосов
/ 26 марта 2011

Две техники разные. См. Описания Развертывание петли и Черепица петли .

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

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

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

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

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

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

19 голосов
/ 26 марта 2011

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

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

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

...