|
|
| Посл.отвђт | Сообщен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 Я заметил что если делать потоком!!!! то ЧИСЛА ПОЛУЧАЮТСЯ ОДИНАКОВЫМИ!!! А как сделать потоками БОЛЬШОЕ ЧИСЛО ЭЛЕМЕНТОВ В МАССИВЕ!!!!! Это загадка!!! Нужны примеры алгоритмов!!!! |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.067 |