ПрограммированиеФорумГрафика

Перемножение матриц( почему-то D3DXMatrixMultiply все-равно быстрее?!) (5 стр)

Страницы: 1 2 3 4 5 6 7 Следующая »
#60
1:15, 7 фев 2010

Убийство!
попробовал на 3dNow, да, действительно быстрее чем SSE =)
Но все равно не дотягивает до DX!

#61
1:16, 7 фев 2010

crsib
> Ошибка компиляции фразы. Отсутствует конец. Не ясен контекст последующей фразы.
fxd

FearOfTheDark
> Убийство!
> попробовал на 3dNow, да, действительно быстрее чем SSE =)
> Но всеравно не дотягивает до DX!
можно код сравнительного теста поглядеть?

#62
1:24, 7 фев 2010
  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() );

закомментированные куски были нужны, чтобы посмотреть результат без переполнения буфера

#63
1:28, 7 фев 2010

А более осмысленное? чтобы можно было скомпилить и запустить?

#64
1:40, 7 фев 2010

crsib
> Помимо этого, меня активно пытаются втянуть в холивар intel vs AMD
Ой-ой, вот только не надо. Вобще-то изначальный пост был адресован Smouking, как пояснение почему одни любят SSE и оптимизацию, а другие как-то не очень. Но конечно, почитетель Intel'а не смог пройти мимо...

>рассказывая всякие веселые истории про цена/производительность, приводя статьи, которые это опровергают и показывая диаграммы, на которые я и сам ссылался.
Ты что-то попутал "малость".

FearOfTheDark
> завтра попробую через 3dNow, но честно говоря, не очень рассчитываю на
> достаточно хороший результат по быстродействию =\
За счет PFACC там всё красиво должно выглядеть, да и в несколько потоков параллелиться без особых проблем.

#65
1:53, 7 фев 2010

Necrys
ссфлка на исходник
3dNow, SSE test

P.s. в реализации еще остались закомментированы пара кусков с SSE

#66
2:02, 7 фев 2010

хм, при цикле больше 1000, моя реализация уступает, меньше все ок!
Дело в переполнении буфера?!

for(size_t i =0; i<1000;i++) //OK

for(size_t i =0; i<1000000;i++) //BAD

#67
2:12, 7 фев 2010

FearOfTheDark
3DNow вариант оч не оптимальный, используй PFACC, вычисляй сразу две строки.

#68
2:16, 7 фев 2010

doc.
эм, можешь на пальцах показать как, ибо я о 3DNow( точнее о асемблеровских ф-ях) услышал час назад, как от силы)
А в два ночи уже мозг не особо =\

#69
2:34, 7 фев 2010

Разобрался с умножением, теперь даже немного быстрее чем D3DXMatrixMultiply.

А вообще, дело все в тестовой программе, она изначально давала неверные временные пропорции( точнее время верное, но в функциях у DX есть некие хитрости, которые надо было учесть )

Огромное спасибо всем!

#70
2:39, 7 фев 2010

FearOfTheDark,а поделится с народом,не желаеш?)

#71
2:55, 7 фев 2010

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. в идеале осталось у себя, тоже, запоминать результаты прошлого вычисления, чтобы заюзать его потом( если производятся такие же вычисления )

#72
3:08, 7 фев 2010

FearOfTheDark
> DX кэширут одинаковые вычисления
скорее не ДХ а сам проц. Исходник не смотрел, но судя по #62 ты множил одни и тежи матрицы вот они и попали в кэш, получается как то не правильно, попробуй умнажать массив на массив.

#73
5:41, 7 фев 2010

Там наверное ещё и проверка перед  операцией есть: например если один из операндов нолик, то умножение будет ноль , а сложение то же, что и второй операнд.

Проверять надо так:  скормить в функцию перемножения глобальные разные матрицы.

#74
11:00, 7 фев 2010

Igor'
> FearOfTheDark,а поделится с народом,не желаеш?)
Присоединяюсь к просьбе! А еще лучше в подсказку оформи - чтобы не затерялась эта информация

Страницы: 1 2 3 4 5 6 7 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.