Форум программистов, компьютерный форум CyberForum.ru

Эффективность развертки циклов - C++

Восстановить пароль Регистрация
 
Gorillych
14 / 14 / 1
Регистрация: 04.07.2013
Сообщений: 76
05.07.2013, 12:42     Эффективность развертки циклов #1
Обдумываю целесообразность разворачивания циклов. Сама по себе задача несложная, но тем не менее, рутинная. Кроме того, читаемость кода после такой оптимизации сильно падает - вложенных циклов не менее 3-х в каждом алгоритме. Задача еще и в том, что надо сделать код более-менее универсальным для разных компиляторов: в intel compiler (или CUDA nvcc) достаточно написать #pragma unroll перед циклом, а для gcc и msvc это уже не подойдет - нужно ручками разворачивать. Мне бы хотелось узнать мнения по следующим пунктам:
1. В среднем, есть ли реальный выигрыш в производительности от ручной развертки? Понимаю, что все зависит от задачи и алгоритма, но хочется узнать в среднем.
2. Как выбирать глубину развертки ? Опять же, в среднем. Под глубиной я подразумеваю следующее:
C++
1
2
3
4
5
6
7
8
9
#define RND(x, s) ((x) & ~((s)-1))
const int stride = 2;//stride - глубина развертки
int i = 0;
for(; i < RND(N, stride); i+=stride)
{
  f(x[i + 0]);
  f(x[i + 1]);
}
for(; i < N; i++) foo(x[i]);
3. что эффективнее - "обычная" развертка, как пример в п.2, или развертка с помощью шаблонов?
Развертка шаблонами:
C++
1
2
3
4
5
6
7
8
9
10
11
12
template <size_t N> struct uint_{ };
 
template <size_t N, typename Lambda, typename IterT>
inline void unroller(const Lambda& f, const IterT& iter, uint_<N>) {
    unroller(f, iter, uint_<N-1>());
    f(iter + N);
}
 
template <typename Lambda, typename IterT>
inline void unroller(const Lambda& f, const IterT& iter, uint_<0>) {
    f(iter);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2013, 12:42     Эффективность развертки циклов
Посмотрите здесь:

Использование циклов C++
C++ Программирование циклов.
Организация циклов в C++ C++
Операторы циклов C++
Прерывание циклов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
05.07.2013, 16:58     Эффективность развертки циклов #2
А зачем все это? Например GCC прекрасно сам циклы разворачивает. Думаю любой современный компилятор просто обязан уметь это делать. Время ручной оптимизации постепенно остается в прошлом десятилетии...
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
05.07.2013, 17:20     Эффективность развертки циклов #3
А взять профилировщик и посмотреть? Возможно, развертка окажется вовсе и не нужна.....
Gorillych
14 / 14 / 1
Регистрация: 04.07.2013
Сообщений: 76
05.07.2013, 22:29  [ТС]     Эффективность развертки циклов #4
Цитата Сообщение от lazybiz Посмотреть сообщение
А зачем все это? Например GCC прекрасно сам циклы разворачивает. Думаю любой современный компилятор просто обязан уметь это делать. Время ручной оптимизации постепенно остается в прошлом десятилетии...
Ну, собственно, я об этом и хотел узнать - стоит или не стоит.

Добавлено через 1 минуту
Цитата Сообщение от CheshireCat Посмотреть сообщение
А взять профилировщик и посмотреть? Возможно, развертка окажется вовсе и не нужна.....
А что профилировщик? Он покажет узкие места программы, а о них я знаю.
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
05.07.2013, 22:43     Эффективность развертки циклов #5
Цитата Сообщение от Gorillych Посмотреть сообщение
стоит или не стоит
Не стоит.
Yandex
Объявления
05.07.2013, 22:43     Эффективность развертки циклов
Ответ Создать тему
Опции темы

Текущее время: 14:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru