15 / 15 / 3
Регистрация: 04.07.2013
Сообщений: 76
1

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

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

Author24 — интернет-сервис помощи студентам
Добрый вечер.
Задача следующая: для каждого базового типа даных 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 на этапе компиляции?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.07.2013, 23:51
Ответы с готовыми решениями:

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

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

C++14: вычисления на этапе компиляции
Добрый день. Есть такой код:struct Qaz { constexpr Qaz(uint8_t index) : _index(index) {} ...

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

7
What a waste!
1607 / 1299 / 180
Регистрация: 21.04.2012
Сообщений: 2,727
07.07.2013, 23:53 2
Gorillych, просто перегрузить функции нельзя?
0
15 / 15 / 3
Регистрация: 04.07.2013
Сообщений: 76
07.07.2013, 23:57  [ТС] 3
gray_fox, можно - я и перегрузил. Но есть некоторая необходимость позаморачиваться с шаблонами, можно ли через них сделать?
0
What a waste!
1607 / 1299 / 180
Регистрация: 21.04.2012
Сообщений: 2,727
07.07.2013, 23:59 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;
}
1
15 / 15 / 3
Регистрация: 04.07.2013
Сообщений: 76
08.07.2013, 00:00  [ТС] 5
gray_fox, круто, то что надо Благодарю.
0
What a waste!
1607 / 1299 / 180
Регистрация: 21.04.2012
Сообщений: 2,727
08.07.2013, 00:04 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);
}
0
15 / 15 / 3
Регистрация: 04.07.2013
Сообщений: 76
08.07.2013, 00:10  [ТС] 7
gray_fox, в моем случае действительно есть необходимость - я чуть позже пример покажу.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
08.07.2013, 00:41 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/... l/map.html
3
08.07.2013, 00:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.07.2013, 00:41
Помогаю со студенческими работами здесь

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

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

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

Вычисление размера массива на этапе компиляции
Нашел код который вычисляет размер массива на этапе компиляции Но сам код мне не понятен....


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru