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

Как максимально быстро сложить два динамических одномерных массива? SSE? - C++

Восстановить пароль Регистрация
 
Teacher269
0 / 0 / 0
Регистрация: 25.12.2012
Сообщений: 12
12.01.2013, 18:39     Как максимально быстро сложить два динамических одномерных массива? SSE? #1
Всем привет! Нужно максимально быстро сложить поэлементно два байтовых массива.
Есть:
C++
1
2
3
4
5
6
7
8
9
10
unsigned char *buf1;
unsigned char *buf2;
unsigned char *buf3;
buf1= new unsigned char[100500];
buf2= new unsigned char[100500];
buf3= new unsigned char[100500];
//чем-то заполняю. И теперь нужно:
for (long i=0;i<100500;i++){
buf3[i]=buf2[i]*3+(255-buf1[i]);//не суть, какая формула сложения
}
Так вот, этот стандартный способ работает довольно медленно. Я слышал, что с помощью SSE можно как-то обрабатывать сразу 16 байт, но не смог разобраться. Везде в примерах участвуют float или double, а мне нужны байты.
Я новичок. Гуглить уже пытался, но ничего не нашел. Может быть кто-нибудь напишет пример сложения "пачки" байт. Вряд ли это очень большой код. Или ссылку, пожалуйста, киньте на что-то подобное.
Заранее благодарен
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.01.2013, 18:39     Как максимально быстро сложить два динамических одномерных массива? SSE?
Посмотрите здесь:

C++ Два массива одномерных
C++ Сложить два массива поэлементно
Как сложить два массива C++
C++ Два динамических массива в конструкторе класса
Поэлементно сложить два массива C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
12.01.2013, 18:44     Как максимально быстро сложить два динамических одномерных массива? SSE? #2
std::memcpy();

EDIT: ой сложить же нужно. Тогда только Ваш способ. Так же можете делать в несколько потоков.
Teacher269
0 / 0 / 0
Регистрация: 25.12.2012
Сообщений: 12
12.01.2013, 19:11  [ТС]     Как максимально быстро сложить два динамических одномерных массива? SSE? #3
но ведь еще MMX вроде умел складывать или умножать сразу по 4 байта. Я натыкался на пример, где перемножалось сразу по 4 float элемента двух массивов
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
12.01.2013, 19:14     Как максимально быстро сложить два динамических одномерных массива? SSE? #4
Так Вам ведь нужно сложение по 1 байту, а не по 4 байта.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
12.01.2013, 19:15     Как максимально быстро сложить два динамических одномерных массива? SSE? #5
Цитата Сообщение от Teacher269 Посмотреть сообщение
MMX
Он работает с векторами всего в 64 бита. SSE же работает с векторами в 128 бит. Еще есть AVX - есть только на новых процессорах, но зато там 256битные векторы и прочие вкусности.
Если вы используете gcc, то можете использовать std::valarray, который очень круто векторизируется. Либо оставить цикл так, как есть, и предоставить компилятору его векторизацию(почти все современные компиляторы умеют это делать, лучше всех справляются gcc и intel).
Ну или можете считать с помощью intrinsics. Но это уже гораздо сложнее, чем просто свалить работу на компилятор.
Yandex
Объявления
12.01.2013, 19:15     Как максимально быстро сложить два динамических одномерных массива? SSE?
Ответ Создать тему
Опции темы

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