Пример использования шаблонов для оптимизации
От: chaotic-good  
Дата: 26.11.14 09:29
Оценка:
Я хочу придумать задачу, в которой шаблонный параметр целочисленного типа использовался бы для оптимизации. Что-то вроде:

template<int X>
void func(...) {
   // делаем что-нибудь такое, что может
   // работать быстрее, если Х известно во 
   // время компиляции
}
Re: Пример использования шаблонов для оптимизации
От: Qt-Coder  
Дата: 26.11.14 09:35
Оценка:
Здравствуйте, chaotic-good, Вы писали:

А оно уже известно — int.
Re[2]: Пример использования шаблонов для оптимизации
От: chaotic-good  
Дата: 26.11.14 09:43
Оценка:
QC>А оно уже известно — int.

Значение целочисленного типа а не сам тип.
Re: Пример использования шаблонов для оптимизации
От: watchmaker  
Дата: 26.11.14 09:46
Оценка:
Здравствуйте, chaotic-good, Вы писали:

CG>Я хочу придумать задачу, в которой шаблонный параметр целочисленного типа использовался бы для оптимизации. Что-то вроде:

CG> // делаем что-нибудь такое, что может работать быстрее, если Х известно во время компиляции
И в чем сложность? Казалось бы сразу можно придумать много примеров с арифметикой, где это позволяет упростить выражение. Вот например проверка на кратность аргумента функции: template <int d> bool isDivisible(int n) { return n % d == 0;} Или арифметика как пример для тебя недостаточно хороша?
Отредактировано 26.11.2014 10:02 watchmaker . Предыдущая версия . Еще …
Отредактировано 26.11.2014 9:55 watchmaker . Предыдущая версия .
Re: Пример использования шаблонов для оптимизации
От: jazzer Россия Skype: enerjazzer
Дата: 26.11.14 09:47
Оценка:
Здравствуйте, chaotic-good, Вы писали:

CG>Я хочу придумать задачу, в которой шаблонный параметр целочисленного типа использовался бы для оптимизации. Что-то вроде:


CG>
CG>template<int X>
CG>void func(...) {
CG>   // делаем что-нибудь такое, что может
CG>   // работать быстрее, если Х известно во 
CG>   // время компиляции
CG>}
CG>


Возведение шаблонного параметра в степень
для двойки это будет просто битовый сдвиг, для нуля и единицы вообще ничего не надо делать, для остальных — что-нть обобщенное.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: Пример использования шаблонов для оптимизации
От: andrey.desman  
Дата: 26.11.14 10:00
Оценка:
Здравствуйте, chaotic-good, Вы писали:

QC>>А оно уже известно — int.


CG>Значение целочисленного типа а не сам тип.


Значение тоже известно — это же параметр шаблона. Ваш кэп.

Если бы можно было делать специализации для аргументов функции, тогда вопрос имел бы смысл.
Re: Пример использования шаблонов для оптимизации
От: oziro Нигерия  
Дата: 26.11.14 10:09
Оценка:
template<unsigned Mask, typename UnsignedT>
UnsignedT SetBitsByMask(const UnsignedT var, const UnsignedT shiftedValue)
{
    return (~Mask & var) | (Mask & shiftedValue);
}


маска обычно известна в компилтайме. var — какая-нибудь переменная, в которй надо установить определенные биты, shiftedValue — значение, которое надо установить в биты, сдвинутое предварительно, что бы совместить требуемые биты.
Re: Пример использования шаблонов для оптимизации
От: Mr.Delphist  
Дата: 26.11.14 10:27
Оценка:
Здравствуйте, chaotic-good, Вы писали:

CG>Я хочу придумать задачу, в которой шаблонный параметр целочисленного типа использовался бы для оптимизации. Что-то вроде:


CG>
CG>template<int X>
CG>void func(...) {
CG>   // делаем что-нибудь такое, что может
CG>   // работать быстрее, если Х известно во 
CG>   // время компиляции
CG>}
CG>


template<int X>
int func() {
    return X;
}


Интересно, заинлайнит?
Отредактировано 26.11.2014 10:28 Mr.Delphist . Предыдущая версия .
Re[2]: Пример использования шаблонов для оптимизации
От: smeeld  
Дата: 26.11.14 11:03
Оценка: :))) :)))
Здравствуйте, jazzer, Вы писали:

J>Возведение шаблонного параметра в степень


Про степень. Вот почему это не работает:

#include <iostream>
#include <string>

template <typename T>

 T  func(T val, T deg){
  T sh;
  T res=1;
  T num=0;
  T degree=deg;
   __asm__ __volatile__ ( 
    "pushq %%rbx \t\n"
    "bsrq %1, %%rbx \t\n"
    "movq %%rbx, %0 \t\n"
    "popq %%rbx \t\n"
    : "=m" (num)
    : "m" (degree)
    : 
    );

  T tmp=1<<num;
   while(tmp>0)
    {
     sh=degree&tmp;
     tmp>>=1;
     res=(sh>0) ? res*res*val : res*res;
    };
 return res;
 };

int main(int c, char** s){
  unsigned long a=std::stoi(s[1]), b=std::stoi(s[2]);
  
  std::cout<<"Res=" <<func(a,b)<<"\n";
 };
  
............................

[g@localhost ~]$ ./x 2 63
Res=0


Если добавить так

template <typename T>

 T  func(T val, T deg){
  T sh;
  T res=1;
  T num=0;
  T degree=deg;
   __asm__ __volatile__ ( 
    "pushq %%rbx \t\n"
    "bsrq %1, %%rbx \t\n"
    "movq %%rbx, %0 \t\n"
    "popq %%rbx \t\n"
    : "=m" (num)
    : "m" (degree)
    : 
    );

  T tmp=1<<num;
   while(tmp>0)
    {
     sh=degree&tmp;
     tmp>>=1;
     res=(sh>0) ? res*res*val : res*res;
    };
  std::cout<<"Yob\n"; /* добавка */
 return res;
 };


то
[g@localhost ~]$ ./x 2 63
Yob
Res=9223372036854775808


?
Re: Пример использования шаблонов для оптимизации
От: CEMb  
Дата: 26.11.14 11:15
Оценка:
Здравствуйте, chaotic-good, Вы писали:

CG>Я хочу придумать задачу, в которой шаблонный параметр целочисленного типа использовался бы для оптимизации. Что-то вроде:


я недавно спрашивал тут
Автор: CEMb
Дата: 09.10.14
, как раз это в результате и предложили.
Re[2]: Пример использования шаблонов для оптимизации
От: chaotic-good  
Дата: 26.11.14 11:41
Оценка:
W>И в чем сложность? Казалось бы сразу можно придумать много примеров с арифметикой, где это позволяет упростить выражение. Вот например проверка на кратность аргумента функции: template <int d> bool isDivisible(int n) { return n % d == 0;} Или арифметика как пример для тебя недостаточно хороша?

Хороший пример, да. Сложность в том, что я сам это не придумал, вот и все
Re: Пример использования шаблонов для оптимизации
От: landerhigh Пират  
Дата: 26.11.14 12:35
Оценка:
Здравствуйте, chaotic-good, Вы писали:

CG>Я хочу придумать задачу, в которой шаблонный параметр целочисленного типа использовался бы для оптимизации. Что-то вроде:


Ну, это не то чтобы оптимизация, но для вычисления чего-то в компайл-тайме — запросто. Можно посчитать логарифм, если хрестоматийный факториал уже задолбал.
Еще можно через такие вещи реализовывать статический полиморфизм при разработке протоколов... я использовал в своем фреймворке для конечных автоматов для построения машины из таблицы переходов...
www.blinnov.com
Re: Пример использования шаблонов для оптимизации
От: jazzer Россия Skype: enerjazzer
Дата: 27.11.14 01:14
Оценка:
Здравствуйте, chaotic-good, Вы писали:

CG>Я хочу придумать задачу, в которой шаблонный параметр целочисленного типа использовался бы для оптимизации. Что-то вроде:


CG>
CG>template<int X>
CG>void func(...) {
CG>   // делаем что-нибудь такое, что может
CG>   // работать быстрее, если Х известно во 
CG>   // время компиляции
CG>}
CG>


Вообще, самое простое — это if:
template<int X>
void func(...) {
   if (X>500) ...
   else if (X>50) ...
   else if (X>5) ...
   else if (X>0) ...
   else ...
}

Поскольку X — константа времени компиляции, компилятор просто выкинет из результирующей функции все условия, которые, как он уже знает, точно не подходят.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Пример использования шаблонов для оптимизации
От: lxa http://aliakseis.livejournal.com
Дата: 27.11.14 10:16
Оценка:
Здравствуйте, chaotic-good, Вы писали:

CG>Я хочу придумать задачу, в которой шаблонный параметр целочисленного типа использовался бы для оптимизации.


В каждой шутке есть доля шутки.
Re[2]: Пример использования шаблонов для оптимизации
От: chaotic-good  
Дата: 27.11.14 12:36
Оценка:
J>Вообще, самое простое — это if:
J>
J>template<int X>
J>void func(...) {
J>   if (X>500) ...
J>   else if (X>50) ...
J>   else if (X>5) ...
J>   else if (X>0) ...
J>   else ...
J>}
J>

J>Поскольку X — константа времени компиляции, компилятор просто выкинет из результирующей функции все условия, которые, как он уже знает, точно не подходят.

Если сделать X простым параметром и передать в функцию константу то компилятор сделает то же самое (constant folding/propagation).
Re[2]: Пример использования шаблонов для оптимизации
От: chaotic-good  
Дата: 27.11.14 12:40
Оценка:
Здравствуйте, lxa, Вы писали:

lxa>Здравствуйте, chaotic-good, Вы писали:


CG>>Я хочу придумать задачу, в которой шаблонный параметр целочисленного типа использовался бы для оптимизации.


lxa>В каждой шутке есть доля шутки.


Не могу понять что делает этот код. Похоже на попытку развернуть цикл вручную с помощью шаблонов и препроцессора.
Re[3]: Пример использования шаблонов для оптимизации
От: jazzer Россия Skype: enerjazzer
Дата: 27.11.14 13:28
Оценка:
Здравствуйте, chaotic-good, Вы писали:

J>>Вообще, самое простое — это if:

J>>Поскольку X — константа времени компиляции, компилятор просто выкинет из результирующей функции все условия, которые, как он уже знает, точно не подходят.

CG>Если сделать X простым параметром и передать в функцию константу то компилятор сделает то же самое (constant folding/propagation).


Ну да, но только если заинлайнится.
А в случае шаблона это произойдет в любом случае.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: Пример использования шаблонов для оптимизации
От: watchmaker  
Дата: 27.11.14 14:00
Оценка: 1 (1)
Здравствуйте, jazzer, Вы писали:

CG>>Если сделать X простым параметром и передать в функцию константу то компилятор сделает то же самое (constant folding/propagation).


J>Ну да, но только если заинлайнится.

J>А в случае шаблона это произойдет в любом случае.
Даже это не всегда бывает. Функция может быть встроена, а константы у компилятора не схлопнутся.
Вот небольшой пример по вычислению обратного числа в полукольце вычетов. Все три компилятора (gcc, clang, icc) разных версий (там в интерфейсе можно выбирать) успешно встраивают функцию, но вычислить её ни у одного не получается. А вот в варианте с шаблонами у всех всё схлопывается до константы.
Отредактировано 27.11.2014 15:35 watchmaker . Предыдущая версия .
Re[5]: Пример использования шаблонов для оптимизации
От: chaotic-good  
Дата: 27.11.14 14:11
Оценка:
J>>Ну да, но только если заинлайнится.
J>>А в случае шаблона это произойдет в любом случае.
W>Даже это не всегда бывает. Функция может быть встроена, а константы у компилятора не схлопнутся.
W>Вот небольшой пример по вычислению обратного числа в полукольце вычетов. Все три компилятора (gcc, clang, icc) разных версий (там в интерфейсе можно выбирать) успешно встраивают значение, но вычислить его ни у одного не получается. А вот в варианте с шаблонами у всех всё схлопывается до константы.

Ну так рекурсия же. Я не могу это так вот просто преобразовать в цикл а потом развернуть, а компилятор — и подавно. Может если бы там был императивный цикл а не рекурсия, то все бы у компилятора получилось.
Re[6]: Пример использования шаблонов для оптимизации
От: jazzer Россия Skype: enerjazzer
Дата: 27.11.14 14:41
Оценка:
Здравствуйте, chaotic-good, Вы писали:

CG>Ну так рекурсия же. Я не могу это так вот просто преобразовать в цикл а потом развернуть, а компилятор — и подавно. Может если бы там был императивный цикл а не рекурсия, то все бы у компилятора получилось.


Так он же превратил хвостовую рекурсию в императивный цикл, в асме же видно. Казалось бы, в чем проблема сделать следующий шаг?

Имхо, этот пример можно в качестве баг-репорта отправлять производителям компиляторов.
Я не вижу ни одной причины, почему бы всем доступным для шаблонов оптимизациям не срабатывать в случае constexpr-функций
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.