Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
nonedark2008
931 / 670 / 147
Регистрация: 28.07.2012
Сообщений: 1,828
#1

SSE2, выравнивание и new - C++

01.05.2013, 15:33. Просмотров 1493. Ответов 13
Метки нет (Все метки)

Потихонечку пишу свою длинную арифметку. И вот на этапе оптимизации мне нужно использовать команды SSE2. Но многие из них требуют выравнивание данных по 16 байт. Я могу использовать _aligned_malloc для динамического выделения памяти, но есть ли аналоги для оператора new? В этом то и вопрос...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.05.2013, 15:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос SSE2, выравнивание и new (C++):

как не использовать SSE2 ? - C++
т.к. у многих юзеров нет поддержки cvtss2sd из него, можно для них что-нить придумать?

Реализация медианного фильтра с применением sse2 - C++
Не знаю, на сколько это для начинающих. Но я только начинаю вникать в суть параллелизации. Суть в том, чтобы реализовать данный фильтр...

SSE2 результат не сходиться - C++
Привет, есть простая реализация алгоритма хеширования паролей MD5. После переноса на SSE2 во втором блоке первого раунда расчеты не верные...

Выравнивание - C++
Насколько я понимаю разрядность системы определяет размер машинного слова. Допустим, я использую Win7 x32, получается, что за 1 такт...

Выравнивание - C++
Почему не происходит выравнивание текста по правому края? int main() { cout.setf(ios::right); cout << "Right"; return 0;...

Выравнивание структур - C++
Подскажите пожалуйста, как в Си++ задать структуру/класс/тип данных, чтобы она/её поля были выровнены на одределённую границу в памяти,...

13
Jupiter
Каратель
Эксперт С++
6560 / 3981 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.05.2013, 15:52 #2
эм..сделать перегрузку операторов new delete?
0
nonedark2008
931 / 670 / 147
Регистрация: 28.07.2012
Сообщений: 1,828
01.05.2013, 16:00  [ТС] #3
Цитата Сообщение от Jupiter Посмотреть сообщение
эм..сделать перегрузку оператора new?
Эмм. Хотелось бы, но как это сделать для выделения обычного массива из целых чисел?
Или отдельно делать класс для хранения массива, в котором перегружать new, а внутри вызывать тот же _aligned_malloc?

Добавлено через 5 минут
Я нашел коечто. Можно перед выделением дописать:
C++
1
__declspec(align(16))
Рещультат даже получается верным. Но даже эта команда не гарантирует, что результат получится выравненным по 16 байт.
0
Jupiter
Каратель
Эксперт С++
6560 / 3981 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.05.2013, 16:06 #4
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Или отдельно делать класс для хранения массива, в котором перегружать new, а внутри вызывать тот же _aligned_malloc?
да. хотя...что-то я поторопился...тут и без перегрузки тогда можно обойтись просто спрятать вызов _aligned_malloc
0
nonedark2008
931 / 670 / 147
Регистрация: 28.07.2012
Сообщений: 1,828
01.05.2013, 16:10  [ТС] #5
Jupiter, это кажется не целесообразным...

У меня появился еще один вопрос. Как раз по поводу выравнивания в SSE2. Зачем оно нужно? Везде написано, что без выравнивания происходит потеря производительности. Но с чем эта потеря связана?
0
Somebody
2791 / 1602 / 147
Регистрация: 03.12.2007
Сообщений: 4,199
Завершенные тесты: 1
01.05.2013, 16:34 #6
C++11:
http://en.cppreference.com/w/cpp/language/alignas
C++
1
2
3
4
5
// every object of type sse_t will be aligned to 16-byte boundary
struct alignas(16) sse_t
{
  float sse_data[4];
};
1
nonedark2008
931 / 670 / 147
Регистрация: 28.07.2012
Сообщений: 1,828
01.05.2013, 16:42  [ТС] #7
Somebody, спасибо за пример. Жалко только, что VS2012 пока это не поддерживает =(
0
Jupiter
Каратель
Эксперт С++
6560 / 3981 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.05.2013, 16:48 #8
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Как раз по поводу выравнивания в SSE2. Зачем оно нужно? Везде написано, что без выравнивания происходит потеря производительности. Но с чем эта потеря связана?
потому что sse2 производит операции над 4-мя 32-хбитными словами за раз, отсюда и требование к выравниванию на 16 байт
0
nonedark2008
931 / 670 / 147
Регистрация: 28.07.2012
Сообщений: 1,828
01.05.2013, 16:52  [ТС] #9
Jupiter, это то я знаю. Но не понимаю в чем разница - прочитаем мы 128 байт с адреса кратного 16, или с адреса не кратного 16. В чем отличие? Даже есть команды, что считывать в регистр с выравненного адреса и с не выровненного...
0
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,357
Записей в блоге: 2
Завершенные тесты: 1
01.05.2013, 17:12 #10
Цитата Сообщение от nonedark2008 Посмотреть сообщение
В чем отличие?
Суть в том, что процессор читает данные по адресам, которые являются 2^N (более конкретно можно уточнить в спеке к процессору). Поэтому при считывании значения по невыровненному адресу происходит следующее:
допустим нам нужно прочитать 4 байта по адресу 123 и процессор умеет читать стразу по 4 байта. Будет прочитано 4 байта по адресу 122, из прочитанного откинется первый байт и далее будет прочитано 4 байта по адресу 126, откуда будет выкинуто 3 последних байта. Потом из всего этого и сложутся нужные 4 байта. Т.е. это очень геморно получается.
1
Jupiter
Каратель
Эксперт С++
6560 / 3981 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.05.2013, 17:19 #11
более детально то что описал Kastaneda
http://www.ibm.com/developerworks/library/pa-dalign/
1
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,357
Записей в блоге: 2
Завершенные тесты: 1
01.05.2013, 17:33 #12
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Жалко только, что VS2012 пока это не поддерживает =(
http://msdn.microsoft.com/ru-ru/library/83ythb65(v=vs.110).aspx
0
nonedark2008
931 / 670 / 147
Регистрация: 28.07.2012
Сообщений: 1,828
01.05.2013, 17:45  [ТС] #13
Kastaneda, мне просто привели код, который поддерживается начиная с C++11, а он в VS2012 не до конца реализован. Про __declspec(align(16)) я уже упоминал где-то выше.
0
BigSmall
1 / 1 / 1
Регистрация: 24.11.2016
Сообщений: 45
20.10.2017, 08:10 #14
--------Удалить моё сообщение.
0
20.10.2017, 08:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2017, 08:10
Привет! Вот еще темы с ответами:

Выравнивание текста - C++
Как мне выравнить текст в этом коде, как показано на рисунке ? cout<<"Едем...

Выравнивание вывода - C++
Как отредактировать вывод, чтобы выводило примерно как на скриншоте ? #include <iostream> #include <fstream> #include <io.h> ...

Выравнивание данных - C++
Итак, как всем известно, обычно тип double занимает 8 байт. Тип char занимает 1 байт (char - 9 байт). Структура вида: struct A { ...

Выравнивание матрицы - C++
Доброго времени суток. Хотелось бы узнать, как сделать чтобы из этого: http://joxi.ru/fA9RUtg5CbDUc_0TDm0 получилось это ...


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

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

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