Убийство!
попробовал на 3dNow, да, действительно быстрее чем SSE =)
Но все равно не дотягивает до DX!
crsib
> Ошибка компиляции фразы. Отсутствует конец. Не ясен контекст последующей фразы.
fxd
FearOfTheDark
> Убийство!
> попробовал на 3dNow, да, действительно быстрее чем SSE =)
> Но всеравно не дотягивает до DX!
можно код сравнительного теста поглядеть?
timer.Reset(); for(size_t i =0; i<2000000;i++) { A = A * B; //if( i%2 == 0 )A=B; } printf("\r\nA time %d\r\n", timer.GetMicroseconds() ); timer2.Reset(); for(size_t i =0; i<2000000;i++) { D3DXMatrixMultiply(&DA,&DA,&DB); //if( i%2 == 0 )DA=DB; } printf("\r\nA time %d\r\n", timer2.GetMicroseconds() );
закомментированные куски были нужны, чтобы посмотреть результат без переполнения буфера
А более осмысленное? чтобы можно было скомпилить и запустить?
crsib
> Помимо этого, меня активно пытаются втянуть в холивар intel vs AMD
Ой-ой, вот только не надо. Вобще-то изначальный пост был адресован Smouking, как пояснение почему одни любят SSE и оптимизацию, а другие как-то не очень. Но конечно, почитетель Intel'а не смог пройти мимо...
>рассказывая всякие веселые истории про цена/производительность, приводя статьи, которые это опровергают и показывая диаграммы, на которые я и сам ссылался.
Ты что-то попутал "малость".
FearOfTheDark
> завтра попробую через 3dNow, но честно говоря, не очень рассчитываю на
> достаточно хороший результат по быстродействию =\
За счет PFACC там всё красиво должно выглядеть, да и в несколько потоков параллелиться без особых проблем.
Necrys
ссфлка на исходник
3dNow, SSE test
P.s. в реализации еще остались закомментированы пара кусков с SSE
хм, при цикле больше 1000, моя реализация уступает, меньше все ок!
Дело в переполнении буфера?!
for(size_t i =0; i<1000;i++) //OK
for(size_t i =0; i<1000000;i++) //BAD
FearOfTheDark
3DNow вариант оч не оптимальный, используй PFACC, вычисляй сразу две строки.
doc.
эм, можешь на пальцах показать как, ибо я о 3DNow( точнее о асемблеровских ф-ях) услышал час назад, как от силы)
А в два ночи уже мозг не особо =\
Разобрался с умножением, теперь даже немного быстрее чем D3DXMatrixMultiply.
А вообще, дело все в тестовой программе, она изначально давала неверные временные пропорции( точнее время верное, но в функциях у DX есть некие хитрости, которые надо было учесть )
Огромное спасибо всем!
FearOfTheDark,а поделится с народом,не желаеш?)
Igor'
да тут все просто!
Дело в том, что:
1) DX кэширут одинаковые вычисления, т.е. для теста пришлось задать каждый раз новые матрицы, чтобы небыл "загружен" кэшированный результат из прошлого прохода цикла.
timer.Reset(); for(size_t i =0; i<3;i++) { A = matrix4x4(i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i); B = matrix4x4(i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i); A = A * B; } printf("\r\nA time %d\r\n", timer.GetMicroseconds() ); timer2.Reset(); for(size_t i =0; i<3;i++) { DA = D3DXMATRIX(i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i); DB = D3DXMATRIX(i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i); D3DXMatrixMultiply(&DA,&DA,&DB); } printf("\r\nDA time %d\r\n", timer2.GetMicroseconds() );
2) оптимизировал свой SSE код( он в примере был закомментирован )
P.s. в идеале осталось у себя, тоже, запоминать результаты прошлого вычисления, чтобы заюзать его потом( если производятся такие же вычисления )
FearOfTheDark
> DX кэширут одинаковые вычисления
скорее не ДХ а сам проц. Исходник не смотрел, но судя по #62 ты множил одни и тежи матрицы вот они и попали в кэш, получается как то не правильно, попробуй умнажать массив на массив.
Там наверное ещё и проверка перед операцией есть: например если один из операндов нолик, то умножение будет ноль , а сложение то же, что и второй операнд.
Проверять надо так: скормить в функцию перемножения глобальные разные матрицы.
Igor'
> FearOfTheDark,а поделится с народом,не желаеш?)
Присоединяюсь к просьбе! А еще лучше в подсказку оформи - чтобы не затерялась эта информация
Тема в архиве.