Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
nonedark2008
1035 / 773 / 215
Регистрация: 28.07.2012
Сообщений: 2,153
#1

SSE2, выравнивание и new

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

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

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

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

SSE2 результат не сходиться
Привет, есть простая реализация алгоритма хеширования паролей MD5. После...

Выравнивание
Насколько я понимаю разрядность системы определяет размер машинного слова....

Выравнивание
Почему не происходит выравнивание текста по правому края? int main() { ...

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

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

У меня появился еще один вопрос. Как раз по поводу выравнивания в SSE2. Зачем оно нужно? Везде написано, что без выравнивания происходит потеря производительности. Но с чем эта потеря связана?
0
Somebody
2799 / 1610 / 251
Регистрация: 03.12.2007
Сообщений: 4,213
Завершенные тесты: 3
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
1035 / 773 / 215
Регистрация: 28.07.2012
Сообщений: 2,153
01.05.2013, 16:42  [ТС] #7
Somebody, спасибо за пример. Жалко только, что VS2012 пока это не поддерживает =(
0
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.05.2013, 16:48 #8
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Как раз по поводу выравнивания в SSE2. Зачем оно нужно? Везде написано, что без выравнивания происходит потеря производительности. Но с чем эта потеря связана?
потому что sse2 производит операции над 4-мя 32-хбитными словами за раз, отсюда и требование к выравниванию на 16 байт
0
nonedark2008
1035 / 773 / 215
Регистрация: 28.07.2012
Сообщений: 2,153
01.05.2013, 16:52  [ТС] #9
Jupiter, это то я знаю. Но не понимаю в чем разница - прочитаем мы 128 байт с адреса кратного 16, или с адреса не кратного 16. В чем отличие? Даже есть команды, что считывать в регистр с выравненного адреса и с не выровненного...
0
Kastaneda
Jesus loves me
Эксперт С++
4822 / 2996 / 345
Регистрация: 12.12.2009
Сообщений: 7,558
Записей в блоге: 2
Завершенные тесты: 1
01.05.2013, 17:12 #10
Цитата Сообщение от nonedark2008 Посмотреть сообщение
В чем отличие?
Суть в том, что процессор читает данные по адресам, которые являются 2^N (более конкретно можно уточнить в спеке к процессору). Поэтому при считывании значения по невыровненному адресу происходит следующее:
допустим нам нужно прочитать 4 байта по адресу 123 и процессор умеет читать стразу по 4 байта. Будет прочитано 4 байта по адресу 122, из прочитанного откинется первый байт и далее будет прочитано 4 байта по адресу 126, откуда будет выкинуто 3 последних байта. Потом из всего этого и сложутся нужные 4 байта. Т.е. это очень геморно получается.
1
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 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
Эксперт С++
4822 / 2996 / 345
Регистрация: 12.12.2009
Сообщений: 7,558
Записей в блоге: 2
Завершенные тесты: 1
01.05.2013, 17:33 #12
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Жалко только, что VS2012 пока это не поддерживает =(
http://msdn.microsoft.com/ru-ru/library/83ythb65(v=vs.110).aspx
0
nonedark2008
1035 / 773 / 215
Регистрация: 28.07.2012
Сообщений: 2,153
01.05.2013, 17:45  [ТС] #13
Kastaneda, мне просто привели код, который поддерживается начиная с C++11, а он в VS2012 не до конца реализован. Про __declspec(align(16)) я уже упоминал где-то выше.
0
BigSmall
1 / 1 / 1
Регистрация: 24.11.2016
Сообщений: 49
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

Выравнивание данных
Итак, как всем известно, обычно тип double занимает 8 байт. Тип char занимает 1...

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

Выравнивание структур
typedef struct _WinBMPFileHeader { WORD FileType; ...


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

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

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