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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Замена getline() http://www.cyberforum.ru/cpp-beginners/thread918163.html
Подскажите замену getline() #include <string> #include <iostream> #include <fstream> #include <conio.h> using namespace std; void main() { string temp_txt1; //объявляем стринговые контейнеры...
C++ Считывание до конца потока в числовой массив Здравствуйте. Проблема с Как реализовать считывание до конца потока из файла вместе со scanf() или != EOF. В поиске нашёл реализацию без него. Добавлено через 11 минут Задана... http://www.cyberforum.ru/cpp-beginners/thread918103.html
C++ tbb parallel_for чтение одного участка памяти разными потоками
Добрый день. Предположим, нужно распараллелить свертку одного и того же изображения разными фильтрами (использую tbb:: parallel_for)- в каждом потоке выполняется свертка своим фильтром. Проблема в...
Определить точки пересечения круга и прямоугольника C++
Помогите, пожалуйста!( Даны вещественные числа x1, y1, r, x2, y2, x3, y3. Определите, существуют ли общие точки у круга с центром в точке (x1, y1) и радиусом r и у области, ограниченной...
C++ Демонстрационная программа сортировки методом «пузырек» http://www.cyberforum.ru/cpp-beginners/thread918036.html
Демонстрационная программа сортировки методом «пузырек» Размер массива не превышает 40 и задается с клавиатуры. Заполнение массива с помощью датчика случайных чисел, из файла или с клавиатуры по...
C++ fatal error LNK1169: one or more multiply defined symbols found Доброго всем времени суток! Никак не могу разобраться в чём дело... Помогите пожалуйста! stdafx.h #pragma once #include "targetver.h" #include <stdio.h> #include <tchar.h> подробнее

Показать сообщение отдельно
Gorillych
14 / 14 / 1
Регистрация: 04.07.2013
Сообщений: 76

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

05.07.2013, 12:42. Просмотров 787. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru