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

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

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

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

07.07.2013, 23:51. Просмотров 758. Ответов 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 типов на этапе компиляции
Посмотрите здесь:

C++ Определение ОС на этапе прекомпиляции
Потоки. Ввод-вывод. Ошибка на этапе компиляции. C++
C++ Создать перегружаемые функции и шаблоны для типов int и double
Ошибка на этапе компиляции C++
Шаблоны странная ошибка во время компиляции C++
C++ Несистематическая ошибка на этапе компиляции
Шаблоны функции для типов char C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
1253 / 1136 / 54
Регистрация: 21.04.2012
Сообщений: 2,359
Завершенные тесты: 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!
1253 / 1136 / 54
Регистрация: 21.04.2012
Сообщений: 2,359
Завершенные тесты: 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!
1253 / 1136 / 54
Регистрация: 21.04.2012
Сообщений: 2,359
Завершенные тесты: 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++ Шаблоны, рекурсия, определение типов std::function
Шаблоны. Ошибка компиляции: "Не удается сопоставить определение функции существующему объявлению" C++
Проверка значения аргумента функции на этапе компиляции C++
C++ Явная специализация шаблона функции - ошибка на этапе компиляции
Как на этапе компиляции определить принадлежность к классу? C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 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 типов на этапе компиляции
Ответ Создать тему
Опции темы

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