Техника оптимизации под линуха

оптимизированный вариант


Американцы называют это "удалением избыточности" (redundancy elimination) или "совместным использованием общих выражений" (Share Common Subexpressions). Полное удаление избыточности (оно же Full Redundancy Elimination или сокращенно FRE) предполагает, что совместное использование выражение происходит только в основных путях (path) выполнения программы. Ветвления при этом игнорируются. Частичное удаление избыточности (оно же Partial redundancy elimination или сокращенно PRE), охватывает весь программный код — как внутри ветвлений, так и снаружи. То есть, частичное удаление избыточности удаляет избыточность намного лучше, чем полное, хотя при полном программа компилируется чуть-чуть быстрее. Вот такая вот терминологическая путаница. Вся заковырка в том, что выражение "Partial redundancy elimination" переводится на русский языке отнюдь не как "частичное удаление избыточности" (хоть это и общепринятый вариант), а "удаление частичной избыточности", а "full redundancy elimination" – "удаление полной избыточности", что совсем не одно и тоже!

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

       /* Sum neighbors of i,j */

       up     = a[(i-1)*n + j  ];

       down   = a[(i+1)*n + j  ];

       left   = a[i*n     + j-1];

       right  = a[i*n     + j+1];

       sum    = up + down + left + right;



Содержание раздела