Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2012, 18:10   #1
Kukurudza
Форумчанин
 
Регистрация: 02.06.2011
Сообщений: 282
По умолчанию SSE инструкции + ликбез

нашел такую штуку в википедии:
Код:
float a[4] = { 300.0, 4.0, 4.0, 12.0 };
float b[4] = {   1.5, 2.5, 3.5,  4.5 };

__asm {
movups xmm0, a   ; // поместить 4 переменные с плавающей точкой из a в регистр xmm0
movups xmm1, b   ; // поместить 4 переменные с плавающей точкой из b в регистр xmm1

mulps xmm1, xmm0 ; // перемножить пакеты плавающих точек: xmm1=xmm1*xmm0
                 ; // xmm10 = xmm10*xmm00
                 ; // xmm11 = xmm11*xmm01
                 ; // xmm12 = xmm12*xmm02
                 ; // xmm13 = xmm13*xmm03

movups a, xmm1   ; // выгрузить результаты из регистра xmm1 по адресам a
};
так работает. но хотелось бы, чтобы массивы были размером скажем по 10000 чисел. нужно это как то делать через указатели и смещение. покажите как?
ну а идеале хотелось бы такую штуку проворачивать с STL-векторами.

как это можно сделать на простых массивах через указатели и смещение и как это сделать для векторов?
Kukurudza вне форума Ответить с цитированием
Старый 10.04.2012, 18:51   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Код:
__declspec(align(16)) float a[10000] = { 300.0, 4.0, 4.0, 12.0, ..... };
__declspec(align(16)) float b[10000] = {   1.5, 2.5, 3.5,  4.5, ..... };

__asm {
LEA esi, [a]
LEA edi, [b]

MOV ecx, 625

align 16
mloop:

MOVAPS xmm0, [esi]
MOVAPS xmm1, [esi+16]
MOVAPS xmm2, [esi+32]
MOVAPS xmm3, [esi+48]

MULPS xmm0, [edi]
MULPS xmm1, [edi+16]
MULPS xmm2, [edi+32]
MULPS xmm3, [edi+48]

MOVAPS [esi], xmm0
MOVAPS [esi+16], xmm1
MOVAPS [esi+32], xmm2
MOVAPS [esi+48], xmm3


ADD esi, 64
ADD edi, 64

LOOP mloop

};
enjoy


ps. думаю, что утомлять себя асм мурзилкой не нужно, потому что копилятор оптимизирует очень хорошо (особенно в случае использования STL). принимая во внимание, что MS компилятор не дружит с ассемблерными вставками в 64-х битном режиме, то смысл от подобных упражнений только общеобразовательный.

Последний раз редактировалось f.hump; 10.04.2012 в 19:07.
f.hump вне форума Ответить с цитированием
Старый 10.04.2012, 19:17   #3
Kukurudza
Форумчанин
 
Регистрация: 02.06.2011
Сообщений: 282
По умолчанию

FUN
на самом деле, интересно почему он не любит АСМ в 64.
ну я прогнал эту штуку как написано выше, и как делают по обыкновенному:
Код:
		for ( size_t j = 0; j < N; ++j )
		{
			a[j] = a[j] * b[j];
		};
прогнал в цикле например 100.000 раз. прирост скорости ошеломил, аж в 500!!! раз быстрее. для меня, напрмер, где я усиленно юзаю векторное перемножение, среди прочих операций, это не плохой плюс.
Kukurudza вне форума Ответить с цитированием
Старый 10.04.2012, 19:22   #4
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Цитата:
прирост скорости ошеломил, аж в 500!!!
для какого N?
f.hump вне форума Ответить с цитированием
Старый 10.04.2012, 19:26   #5
Kukurudza
Форумчанин
 
Регистрация: 02.06.2011
Сообщений: 282
По умолчанию

Код:
static const size_t N = 1000;
static const size_t M = 100000;
	for (register size_t i = 0; i < M; ++i)
	{
		for (register size_t j = 0; j < N; ++j )
		{
			a[j] = a[j] * b[j];
		};
	};
ну и то же самое для SSE
Kukurudza вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ubuntu Linux: настроил Ин-т(PPPoE). Нужен краткий ликбез опытного линуксоида по поводу безопасности Alexei91 Безопасность, Шифрование 7 24.06.2011 06:32
cisco packet tracer ликбез the_deer_one Свободное общение 0 14.06.2011 13:04
оптимизация SSE ANsy Мультимедиа в Delphi 1 01.02.2011 20:08
статья - Введение в SSE Pblog Обсуждение статей 0 23.06.2010 05:13
SSE intrinsics C++ qpharm Общие вопросы C/C++ 1 13.11.2009 12:57