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

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

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

Шаблоны и определение SSE типов на этапе компиляции - C++

07.07.2013, 23:51. Просмотров 774. Ответов 7
Метки нет (Все метки)

Добрый вечер.
Задача следующая: для каждого базового типа даных int, float и double есть свой intrinsic SSE тип - __m128i, __m128 и __m128d соответсвенно. Предположим, что для каждого перечисленного типа у меня есть реализация некоторой функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Реализация для int
void func(int *data)
{
    __m128i* data_sse = (__m128i*) data;
}
//Реализация для float
void func(float *data)
{
    __m128* data_sse = (__m128*) data;
}
 
//Реализация для double
void func(double *data)
{
    __m128d* data_sse = (__m128d*) data;
}
Но мне хочется сделать шаблонную функцию, которая в compiletime будет выбирать соответсвующий intrinsic. Что-то вроде того:
C++
1
2
3
4
5
template<typename Type>
void finc(Type *data)
{
    appropriate_sse_intrinsic* data_sse=(appropriate_sse_intrinsic*) data;//appropriate_sse_intrinsic - тип, который нужно определить во время компиляции
}
Как найти appropriate_sse_intrinsic с помошью RTTI вполне ясно, но это отразится на производительности. А как мне определить appropriate_sse_intrinsic на этапе компиляции?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2013, 23:51     Шаблоны и определение SSE типов на этапе компиляции
Посмотрите здесь:

Шаблоны, рекурсия, определение типов std::function - C++
#include &lt;tuple&gt; #include &lt;vector&gt; #include &lt;iostream&gt; #include &lt;functional&gt; #include &lt;type_traits&gt; template&lt;typename T&gt; ...

Шаблоны. Ошибка компиляции: "Не удается сопоставить определение функции существующему объявлению" - C++
vector.h #pragma once #ifndef _VECTOR_H #define _VECTOR_H #include &lt;exception&gt; template&lt;typename T&gt; class vector...

Ошибка на этапе компиляции - C++
Добрый вечер. Ребят помогите, не могу понять в чем дело. Есть программа в которой описан 1 класс (работа с пользователями) Всё...

Несистематическая ошибка на этапе компиляции - C++
#pragma hdrstop #pragma argsused #include &lt;iostream.h&gt; void main() { double a; int index,i_max,i_min; double...

Чтение файла на этапе компиляции - C++
Можно ли считать файл настроек на этапе компиляции? Нужно что бы выбросить код который в рантайме не понадобится (в зависимости от...

Проверка типа переменной на этапе компиляции - C++
Добрый день. Прошу экспертов( ну или всех, кто это знает ) показать, как правильно &quot;повешать&quot; проверку времени компиляции на то, был ли...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
1411 / 1140 / 55
Регистрация: 21.04.2012
Сообщений: 2,362
Завершенные тесты: 3
07.07.2013, 23:53     Шаблоны и определение SSE типов на этапе компиляции #2
Gorillych, просто перегрузить функции нельзя?
Gorillych
14 / 14 / 1
Регистрация: 04.07.2013
Сообщений: 76
07.07.2013, 23:57  [ТС]     Шаблоны и определение SSE типов на этапе компиляции #3
gray_fox, можно - я и перегрузил. Но есть некоторая необходимость позаморачиваться с шаблонами, можно ли через них сделать?
gray_fox
What a waste!
1411 / 1140 / 55
Регистрация: 21.04.2012
Сообщений: 2,362
Завершенные тесты: 3
07.07.2013, 23:59     Шаблоны и определение SSE типов на этапе компиляции #4
Ну может так, type_traits
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template<typename>
struct apropriate_sse_intrinsic;
 
template<>
struct apropriate_sse_intrinsic<int> {
 
   using type = __m128i;
};
 
// ...
 
template<typename T>
using sse_intrinsic = typename apropriate_sse_intrinsic<T>::type;
 
template<typename T>
void func(T * data) {
   sse_intrinsic<T> * data_sse = (sse_intrinsic<T> *)data;
}
Gorillych
14 / 14 / 1
Регистрация: 04.07.2013
Сообщений: 76
08.07.2013, 00:00  [ТС]     Шаблоны и определение SSE типов на этапе компиляции #5
gray_fox, круто, то что надо Благодарю.
gray_fox
What a waste!
1411 / 1140 / 55
Регистрация: 21.04.2012
Сообщений: 2,362
Завершенные тесты: 3
08.07.2013, 00:04     Шаблоны и определение SSE типов на этапе компиляции #6
Gorillych, я просто смысла не вижу, вроде перегрузка всё решает...

Добавлено через 3 минуты
Может даже так:
C++
1
2
3
4
5
6
7
8
9
template<typename T>
typename apropriate_sse_intrinsic<T>::type * sse_intrinsic(T * data) {
   return reinterpret_cast<typename apropriate_sse_intrinsic<T>::type *>(data);
}
 
template<typename T>
void func(T * data) {
   auto data_sse = sse_intrinsic(data);
}
Gorillych
14 / 14 / 1
Регистрация: 04.07.2013
Сообщений: 76
08.07.2013, 00:10  [ТС]     Шаблоны и определение SSE типов на этапе компиляции #7
gray_fox, в моем случае действительно есть необходимость - я чуть позже пример покажу.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2013, 00:41     Шаблоны и определение SSE типов на этапе компиляции
Еще ссылки по теме:

Вычисление размера массива на этапе компиляции - C++
Нашел код который вычисляет размер массива на этапе компиляции Но сам код мне не понятен. Объясните плз #include &lt;iostream&gt; ...

Как на этапе компиляции определить принадлежность к классу? - C++
Есть шаблонный класс, который в зависимости от переданного класса в параметре подбирает нужный контейнер-обёртку. template&lt;typename...

Потоки. Ввод-вывод. Ошибка на этапе компиляции. - C++
#include &lt;windows.h&gt; #include &lt;fstream&gt; #include &lt;iostream&gt; #include &lt;iomanip&gt; using namespace std; void main() { char...

Проверка значения аргумента функции на этапе компиляции - C++
Функция должна принимать int в качестве аргумента. Как можно на этапе компиляции проверить что значения аргумента больше ноля? Не могу...


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

Или воспользуйтесь поиском по форуму:
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
08.07.2013, 00:41     Шаблоны и определение SSE типов на этапе компиляции #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
typedef boost::mpl::map<
boost::mpl::pair<int, __m128i>,
boost::mpl::pair<float, __m128>,
boost::mpl::pair<double, __m128d>> sse_types;
 
template<typename T>
void func(T* data)
{
   typedef typename boost::mpl::at<sse_types, T>::type sse_type;
   sse_type* data_sse = reinterpret_cast<sse_type*>(data);
}
http://www.boost.org/doc/libs/1_54_0...anual/map.html
Yandex
Объявления
08.07.2013, 00:41     Шаблоны и определение SSE типов на этапе компиляции
Ответ Создать тему
Опции темы

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