· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› SSE (help)

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Сен 4, 2003 10:58:29

Проблема такая!!! Кто знает пожалуйста помогите!!!
Есть С-функция которая делает арифметические операции с вещественными числами!!! Вернее с массивами вещественных чисел!!!

for(i=0;i<5;i++)
{
rez[i]=mas1[i]*mas2[i]+mas3[i]*mas4[i]
}

Я пытался переписать это полностью на SSE!!! и получается другие результаты!!! но на немного!!! Подозреваю что это из-за точности!! Но как это может быть???? Пробывал уже и менять в регистре управления и состояния биты которые влияют на округление но оказалось что бессполезно!!! Что делать??? ПОДСКАЖИТЕ!! Может кто и сталкивался с этой информацией!!! Может доки какие почитать по этому поводу!!! Мой код на АСМЕ выглядит так:
(естественно mas1+4 заменится адресом!! Я пишу так чтобы было понятно)

xor esi,esi - счетчик массива
mov ecx,5 - счетчик цикла
cikl:

movss xmm1,[mas1+esi]
movss xmm3,[mas3+esi]
mulss xmm1,[mas2+esi]
mulss xmm3,[mas4+esi]
addss xmm1,xmm3
movss [rez+esi],xmm1

add esi,4
loop cikl

КТО ЗНАЕТ И МОЖЕТ КАКИЕ НИБУДЬ ДАТЬ ДЕЛЬНЫЕ СОВЕТЫ!! ПОЖАЛУЙСТА ОТКЛИКНИТЕСЬ!!!!!


Дата: Сен 4, 2003 11:02:46

Результаты получаются такие на C массив REZ:
1) 51,399952
2) 51,399952
3) 51,399704
4) 51,399704
5) 51,400196
на АСМе с использованием SSE:
1) 51,399902
2) 51,399902
3) 51,399414
4) 51,399414
5) 51,400391
Отличия в числах после запятой!!! Это я перемножал маленькие числа!! А если перемножать большие то и до запятой тоже отличаются!!!!


Дата: Сен 4, 2003 13:51:04 · Поправил: Fixer

У тебя в C коде тело цикла выполняется 4 раза а в ассемблерном 5.

Странный, загадочный код, почему ты ни хочешь воспользоваться потоковыми возможностями SSE?
В твоем случае нужно было бы записать
  movups xmm1,[mas1] 
  movups xmm3,[mas3] 
  mulps xmm1,[mas2] 
  mulps xmm3,[mas4] 
  addps xmm1,xmm3 
  movups [rez],xmm1 

и никаких циклов не надо если сможешь добиться выравнивание массива mas1 и mas3 по адрессам кратным 16 байт, то лучше заместо movups поставить movaps


Дата: Сен 4, 2003 21:08:12

Не!! Там в коде все нормально!!!! 5 раз!!!
так понятно!! А если цикл не 5 раз выполняется а 1000????


Дата: Сен 4, 2003 21:57:54

Тебе что код написать, а где же собственное творчество?


Дата: Сен 4, 2003 21:58:51

Я же правильно код написал!! Только вместо 5 переменную подставить!!!!!!!!!


Дата: Сен 4, 2003 21:59:46

Чего то не выходит у меня!! Может твой код посмотрю!!! Мне это надо чисто для себя разобраться в чем дело!!!!


Дата: Сен 4, 2003 22:02:15

Просто похоже тут больше никто не ЮЗАЛ SSE!!!!


Дата: Сен 5, 2003 00:32:21

Не проверял но должно быть так
;в ecx - количество элементов массива
   mov    eax, ecx
   and    eax, 0FFFFFFFCh
   jz     _2float
   shl    eax, 2

_4float:
   sub    eax, 0Fh
   movups xmm1,[mas1+eax] 
   movups xmm2,[mas3+eax] 
   mulps  xmm1,[mas2+eax] 
   mulps  xmm2,[mas4+eax] 
   addps  xmm1,xmm2 
   movups [rez+eax],xmm1
   test   eax, eax
   jnz    _4float

_2float:
   test   ecx, 2
   jz     _float
   mov    eax, ecx
   and    eax, 1
   shl    eax, 2
   movhps xmm1,[mas1+eax] 
   movhps xmm2,[mas3+eax] 
   mulps  xmm1,[mas2+eax] 
   mulps  xmm2,[mas4+eax] 
   addps  xmm1,xmm2 
   movhps  [rez+eax],xmm1

_float:
   test   ecx, 1
   jz     _end_math
   movss xmm1,[mas1] 
   movss xmm2,[mas3] 
   mulss  xmm1,[mas2] 
   mulss  xmm2,[mas4] 
   addss  xmm1,xmm2 
   movss  [rez],xmm1

_end_math:


Дата: Сен 5, 2003 01:06:54

А чем это отличается от моего кода??? в чем должно быть отличие??? ТЫ ПРОСТО РАЗВЕРНУЛ ЦИКЛ!!!! Я не утверждаю интересуюсь!!! И из за этого изменится точность?


Дата: Сен 5, 2003 03:55:59

Что то не врубился!! Зачем это делаешь?


Дата: Сен 5, 2003 03:56:07

Что то не врубился!! Зачем это делаешь?
and eax, 0FFFFFFFCh


Дата: Сен 5, 2003 03:58:44

а нее!! понял


Дата: Сен 5, 2003 04:12:36

А где можно прочитать про ПОТОЧНОСТЬ В SSE!!!????? Чтобы чамому разобраться!!!!


Дата: Сен 5, 2003 04:29:37

Я заметил что если делать потоком!!!! то ЧИСЛА ПОЛУЧАЮТСЯ ОДИНАКОВЫМИ!!! А как сделать потоками БОЛЬШОЕ ЧИСЛО ЭЛЕМЕНТОВ В МАССИВЕ!!!!! Это загадка!!! Нужны примеры алгоритмов!!!!

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.067