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

Эффективность развертки циклов - 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; //объявляем стринговые контейнеры string first_txt1;
C++ Считывание до конца потока в числовой массив Здравствуйте. Проблема с Как реализовать считывание до конца потока из файла вместе со scanf() или != EOF. В поиске нашёл реализацию без него. Добавлено через 11 минут Задана последовательность целых чисел. Числа нумеруются по порядку следования, начиная с единицы. Требуется написать программу, которая найдет сумму максимума из чисел с четными номерами и минимума из чисел с нечетными... http://www.cyberforum.ru/cpp-beginners/thread918103.html
C++ tbb parallel_for чтение одного участка памяти разными потоками
Добрый день. Предположим, нужно распараллелить свертку одного и того же изображения разными фильтрами (использую tbb:: parallel_for)- в каждом потоке выполняется свертка своим фильтром. Проблема в том, что разные потоки обращаются на чтение к одному и тому же участку памяти - массиву с исходным изображением. Повлияет ли это на производительность? В CUDA bank conflicts можно разрешить, например,...
Определить точки пересечения круга и прямоугольника C++
Помогите, пожалуйста!( Даны вещественные числа x1, y1, r, x2, y2, x3, y3. Определите, существуют ли общие точки у круга с центром в точке (x1, y1) и радиусом r и у области, ограниченной прямоугольником, стороны которого параллельны или перпендикулярны осям координат, а (x2, y2) и (x3, y3) – координаты его противоположных вершин. Ввод В первой строке содержатся три вещественных числа...
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
05.07.2013, 12:42     Эффективность развертки циклов
Обдумываю целесообразность разворачивания циклов. Сама по себе задача несложная, но тем не менее, рутинная. Кроме того, читаемость кода после такой оптимизации сильно падает - вложенных циклов не менее 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);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 10:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru