Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Gorillych
14 / 14 / 1
Регистрация: 04.07.2013
Сообщений: 76
#1

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

05.07.2013, 12:42. Просмотров 792. Ответов 4
Метки нет (Все метки)

Обдумываю целесообразность разворачивания циклов. Сама по себе задача несложная, но тем не менее, рутинная. Кроме того, читаемость кода после такой оптимизации сильно падает - вложенных циклов не менее 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);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2013, 12:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Эффективность развертки циклов (C++):

Определить эффективность курсов - C++
Здравствуйте! Свой первый пост начну, по традиции, с глупого вопроса:-[ Окончил университет по спец &quot;Информационные системы и...

Как определить эффективность програмного кода? - C++
Всем привет! Недавно начал изучать С++ и сразу возник принципиальный вопрос. Как определить эффективность програмного кода? ...

Как повысить эффективность загрузки процессора? - C++
Дамы и господа! Недавно выяснилось, что мои задачи загружают процессор только на 25%. Якобы так по умолчанию, а чтобы было больше,...

Исследовать эффективность двух алгоритмов определения простоты числа - C++
дали задание: Цель: Следует выбрать эффективный алгоритм (по времени) теста простоты числа. На исследование вам дается два алгоритма: ...

Найти первые N чисел Фибоначчи (рекурсия/итерация, сравнить эффективность) - C++
Найти первые N чисел Фибоначчи двумя способами: с помощью рекурсии и с помощью итерации. Сравнить эффективность алгоритмов.

Счетчик циклов - C++
помогите найти ошибку: #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;cstdlib&gt; using namespace std; int main(int argc, char**...

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

Добавлено через 1 минуту
Цитата Сообщение от CheshireCat Посмотреть сообщение
А взять профилировщик и посмотреть? Возможно, развертка окажется вовсе и не нужна.....
А что профилировщик? Он покажет узкие места программы, а о них я знаю.
0
castaway
Эксперт С++
4916 / 3024 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
05.07.2013, 22:43 #5
Цитата Сообщение от Gorillych Посмотреть сообщение
стоит или не стоит
Не стоит.
0
05.07.2013, 22:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2013, 22:43
Привет! Вот еще темы с ответами:

Распараллеливание циклов - C++
Возникли трудности с освоением OpenMP Непонимаю, почему если закоментировать вот этот фрагмент кода, то программа работает вы разы...

Объединение циклов - C++
Доброго времени суток! Есть объединенный цикл. Что выполняет данный цикл? И как сделать что бы был виден результат его работы? for(int...

Вложение циклов - C++
Объясните вложение циклов и привидите примерчик какой-нить...

Организация циклов в С - C++
Составить программу в С: 1. Составить программу, проверяющую, является ли заданное натуральное число совершенным, то есть равным сумме...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.