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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,343
01.05.2013, 15:33     SSE2, выравнивание и new #1
Потихонечку пишу свою длинную арифметку. И вот на этапе оптимизации мне нужно использовать команды SSE2. Но многие из них требуют выравнивание данных по 16 байт. Я могу использовать _aligned_malloc для динамического выделения памяти, но есть ли аналоги для оператора new? В этом то и вопрос...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.05.2013, 15:33     SSE2, выравнивание и new
Посмотрите здесь:

C++ как не использовать SSE2 ?
C++ Выравнивание текста
C++ Выравнивание структур
Выравнивание данных C++
Выравнивание структур C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.05.2013, 15:52     SSE2, выравнивание и new #2
эм..сделать перегрузку операторов new delete?
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,343
01.05.2013, 16:00  [ТС]     SSE2, выравнивание и new #3
Цитата Сообщение от Jupiter Посмотреть сообщение
эм..сделать перегрузку оператора new?
Эмм. Хотелось бы, но как это сделать для выделения обычного массива из целых чисел?
Или отдельно делать класс для хранения массива, в котором перегружать new, а внутри вызывать тот же _aligned_malloc?

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

У меня появился еще один вопрос. Как раз по поводу выравнивания в SSE2. Зачем оно нужно? Везде написано, что без выравнивания происходит потеря производительности. Но с чем эта потеря связана?
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
01.05.2013, 16:34     SSE2, выравнивание и new #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];
};
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,343
01.05.2013, 16:42  [ТС]     SSE2, выравнивание и new #7
Somebody, спасибо за пример. Жалко только, что VS2012 пока это не поддерживает =(
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.05.2013, 16:48     SSE2, выравнивание и new #8
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Как раз по поводу выравнивания в SSE2. Зачем оно нужно? Везде написано, что без выравнивания происходит потеря производительности. Но с чем эта потеря связана?
потому что sse2 производит операции над 4-мя 32-хбитными словами за раз, отсюда и требование к выравниванию на 16 байт
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,343
01.05.2013, 16:52  [ТС]     SSE2, выравнивание и new #9
Jupiter, это то я знаю. Но не понимаю в чем разница - прочитаем мы 128 байт с адреса кратного 16, или с адреса не кратного 16. В чем отличие? Даже есть команды, что считывать в регистр с выравненного адреса и с не выровненного...
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
01.05.2013, 17:12     SSE2, выравнивание и new #10
Цитата Сообщение от nonedark2008 Посмотреть сообщение
В чем отличие?
Суть в том, что процессор читает данные по адресам, которые являются 2^N (более конкретно можно уточнить в спеке к процессору). Поэтому при считывании значения по невыровненному адресу происходит следующее:
допустим нам нужно прочитать 4 байта по адресу 123 и процессор умеет читать стразу по 4 байта. Будет прочитано 4 байта по адресу 122, из прочитанного откинется первый байт и далее будет прочитано 4 байта по адресу 126, откуда будет выкинуто 3 последних байта. Потом из всего этого и сложутся нужные 4 байта. Т.е. это очень геморно получается.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.05.2013, 17:19     SSE2, выравнивание и new #11
более детально то что описал Kastaneda
http://www.ibm.com/developerworks/library/pa-dalign/
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
01.05.2013, 17:33     SSE2, выравнивание и new #12
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Жалко только, что VS2012 пока это не поддерживает =(
http://msdn.microsoft.com/ru-ru/libr...v=vs.110).aspx
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.05.2013, 17:45     SSE2, выравнивание и new
Еще ссылки по теме:

C++ Выравнивание матрицы
Выравнивание C++
C++ Реализация медианного фильтра с применением sse2

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

Или воспользуйтесь поиском по форуму:
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,343
01.05.2013, 17:45  [ТС]     SSE2, выравнивание и new #13
Kastaneda, мне просто привели код, который поддерживается начиная с C++11, а он в VS2012 не до конца реализован. Про __declspec(align(16)) я уже упоминал где-то выше.
Yandex
Объявления
01.05.2013, 17:45     SSE2, выравнивание и new
Ответ Создать тему
Опции темы

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