Оптимизация g ++ при индексации массива с помощью инъективной функции - PullRequest
2 голосов
/ 15 октября 2010

У меня есть цикл for, где на каждом шаге i обрабатывается элемент массива p [f (i)], где f (i) - инъективное (взаимно-однозначное) отображение из 1 ... n в 1 ... м (м> н). Таким образом, в цикле отсутствует связывание данных, и можно использовать все методы оптимизации компилятора, такие как конвейерная обработка. Но как я могу сообщить g ++ о инъективности f (i)? Или мне даже нужно (можно это понять с помощью g ++)?

Ответы [ 3 ]

6 голосов
/ 15 октября 2010

Предполагая, что f не зависит от какого-либо глобального состояния и не вызывает побочных эффектов, вы можете пометить его атрибутом const :

int f(int i) __attribute__((const));

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

Эти атрибуты позволяют gcc оптимизировать больше, чем могли бы, хотя я не знаю, будут ли они полезны в вашем случае.Посмотрите на сгенерированный ассемблерный код и посмотрите, помогут ли они.

0 голосов
/ 15 октября 2010

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

0 голосов
/ 15 октября 2010

Вы также можете попробовать обработать цикл с помощью массива временного хранения, например:

temp[i]= process(p[f(i)]);

, а затем скопировать результаты обратно:

p[f(i)]= temp[i];

Предполагая, что вы объявили p и *Если указатели ограничены, у компилятора достаточно информации для более агрессивной оптимизации.

...