Помогите оптимизировать код

Тема в разделе "WASM.BEGINNERS", создана пользователем AndreyATC, 16 май 2007.

  1. AndreyATC

    AndreyATC New Member

    Публикаций:
    0
    Регистрация:
    16 май 2007
    Сообщения:
    60
    Код (Text):
    1. NormVecSSE2_2   proc uses esi edi ecx ebx edx Vector:DWORD, LMass:DWORD
    2.     .data
    3.     align 16
    4.     tempSSE  dq 2 dup (0)
    5.     .code
    6.     sub LMass,2
    7.     mov eax,LMass
    8.     mul LMass
    9.     mov ebx,2
    10.     div ebx
    11.     mov ecx,eax
    12.     mov esi,Vector
    13.     lea edi,tempSSE
    14.     finit
    15.     fldz
    16.     fst qword ptr [edi]
    17.     fst qword ptr [edi+8]
    18. LNVSSE_1:
    19.     movapd  xmm0,[esi]
    20.     mulpd   xmm0 ,[esi]
    21.     addpd   xmm0,[edi]
    22.     movapd  [edi],xmm0 
    23.     add esi,16
    24.     loop LNVSSE_1
    25.     movapd xmm0,[edi]
    26.     unpckhpd xmm0,[edi]
    27.     addsd   xmm0,[edi]
    28.     lea edi,temp
    29.     movsd [edi],xmm0
    30.     cmp edx,0
    31.     je  NVexit 
    32.     movsd   xmm0,qword ptr [esi]
    33.     mulsd   xmm0,[esi]
    34.     addpd   xmm0,[edi]
    35.     movsd   [edi],xmm0
    36. NVexit:
    37.    
    38.     ret
    39.  
    40. NormVecSSE2_2 endp
     
  2. AndreyATC

    AndreyATC New Member

    Публикаций:
    0
    Регистрация:
    16 май 2007
    Сообщения:
    60
    Єтот код выполняется в цыкле очень много и много раз!
    причем размерность вектора как правило >500
     
  3. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    для начала неплохо бы использовать тег code
     
  4. AndreyATC

    AndreyATC New Member

    Публикаций:
    0
    Регистрация:
    16 май 2007
    Сообщения:
    60
    Asterix
    Тоест?
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    т.е. оформить код как полагается, для этого форум поддерживает bb коды, например
    [ code ]здесь ваш код[ /code ], причем между [ и ] и словом code пробелы нужно убрать
     
  6. AndreyATC

    AndreyATC New Member

    Публикаций:
    0
    Регистрация:
    16 май 2007
    Сообщения:
    60
    Asterix
    Только причем здесь оптимизация:)
     
  7. AndreyATC

    AndreyATC New Member

    Публикаций:
    0
    Регистрация:
    16 май 2007
    Сообщения:
    60
    :dntknw:(( не судьба значит:dntknw:((
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    AndreyATC
    1) не понятно что такое LMass и почему число элементов = (LMass-2)^2
    2) не понятен финт с fst qword ptr [edi]. Зачем вообще записывать результат в память, если у тебя куча свободных регистров. Обнули какой-нибудь xmm7 (pxor или xorps) и копи в нем результат addpd xmm7,xmm0
    3) в цикле суммирования addpd по любому тормозят, т.к. являются зависимыми и имеют латентность 3-5 тактов в зависимости от проца. Для ускорения нужно развернуть цикл еще на 2 и использовать независимые накопления в двух регистрах
    Код (Text):
    1.   pxor xmm6,xmm6
    2.   pxor xmm7,xmm7
    3. @@:
    4.   movapd xmm0,[esi]
    5.   mulpd xmm0,[esi]      ;или movapd xmm1,[esi] + mulpd xmm0,xmm1
    6.   addpd xmm6,xmm0
    7.   movapd xmm0,[esi+16]
    8.   mulpd xmm0,[esi+16]  ;или movapd xmm1,[esi] + mulpd xmm0,xmm1
    9.   addpd xmm7,xmm0
    10.   add esi,32
    11.   sub ecx,1
    12.   jnz @B
    13.   addpd xmm7,xmm6
     
  9. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Так ты по-человеески объясни, что за алгоритм, что он призван делать, какие задачи решать, какие ты сам попытк предпринимал, тогда и у людей, глядишь, появится желание тебе помочь. А то бросил шмот кода, нати, оптимизируйте.
     
  10. AndreyATC

    AndreyATC New Member

    Публикаций:
    0
    Регистрация:
    16 май 2007
    Сообщения:
    60
    Извините что не обяснил сразу! єто процедура определенья квадрата нормы вектора.
    1) (LMass-2)^2 - длина вектора
    2) fst qword ptr [edi]-сглупил:)
     
  11. AndreyATC

    AndreyATC New Member

    Публикаций:
    0
    Регистрация:
    16 май 2007
    Сообщения:
    60
    т.е norm^2=X1^2+X2^2+...+Xn^2
     
  12. AndreyATC

    AndreyATC New Member

    Публикаций:
    0
    Регистрация:
    16 май 2007
    Сообщения:
    60
    leo
    если не секрет?
    в чем выигрыш при разбитии цикла на 2?
    Код ниже выполница за первый проход
    movapd xmm0,[esi]
    mulpd xmm0,[esi] ;или movapd xmm1,[esi] + mulpd xmm0,xmm1
    addpd xmm6,xmm0
    а этот за следующий проход в цикле
    movapd xmm0,[esi+16]
    mulpd xmm0,[esi+16] ;или movapd xmm1,[esi] + mulpd xmm0,xmm1
    addpd xmm7,xmm0
    циклов станет меньше, а инструкций нет… в чем же выгода?
     
  13. AndreyATC

    AndreyATC New Member

    Публикаций:
    0
    Регистрация:
    16 май 2007
    Сообщения:
    60
    leo
    ты прав так действительно быстрее!спасибо!)
    но всеже почему? общее количество инструкций не меняеться?
     
  14. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    AndreyATC
    В современных процессорах рулит спекулятивное исполнение циклов и ветвлений, т.е. если инструкции в теле цикла выполняются дольше, чем происходит доставка новых операций из кэша, то выполнение следующей итерации цикла начинается еще до завершения предыдущей. Поэтому если сложения зависимы, то следующий addpd должен ждать завершения предыдущего, а если независимы, то они могут частично перекрываться
    Вот для наглядности примерная диаграмма для P4
    Код (Text):
    1. movapd  dxxxxxx................. //d - dispatch по 3 мопа за такт
    2. movapd  d.xxxxxx................ //x - eXecute, число тактов = latency
    3. mulpd   d.......xxxxxx.......... <-- моп загрузки и при mulpd r,m и при (mov r,m + mulpd r,r)
    4. addpd   .d............xxxx...... <-- add1
    5. movapd  .d.xxxxxx.........|.....
    6. movapd  .d..xxxxxx........|.....
    7. mulpd   ..d.......xxxxxx..|.....
    8. addpd   ..d.............xxxx.... <-- add2 не зависит от add1, поэтому не ждет его
    9. add     ..dx...............|....     завершения, что приводит к экономии 2 тактов на цикл
    10. sub     ...dx..............|....
    11. jnz     ...dx..............|....
    12. ---------------------------|---|
    13. movapd  ....dxxxxxx............| <-- следующая итерация начинается не дожидаясь
    14. movapd  ....d.xxxxxx...........|     завершения предыдущей
    15. mulpd   ....d.......xxxxxx.....|
    16. addpd   .....d............xxxx.| <-- add1 зависит от предыдущего add1
    17. movapd  .....d.xxxxxx..........|
    18. movapd  .....d..xxxxxx.........|
    19. mulpd   ......d.......xxxxxx...|
    20. addpd   ......d.............xxxx <-- add2 зависит от предыдущего add2, но не зависит от add1
    21. add     ......dx................
    22. sub     .......dx...............
    23. jnz     .......dx...............
    24. --------------------------------
    25. дальше все повторяется
    В итоге имеем 4 такта на цикл из двух сложений, а без разворота было бы 4 такта на одно сложение

    PS: Все равно я не понял, почему длина вектора = (LMass-2)^2 а не просто LMass ?
    И еще, раз уж речь идет об оптимизации, то деление на степень 2 нужно выполнять сдвигом, а не div-ом
    Код (Text):
    1.   mov edx,eax
    2.   shr eax,2   ;eax=eax/4
    3.   and edx,3  ;edx = остаток 0..3
     
  15. AndreyATC

    AndreyATC New Member

    Публикаций:
    0
    Регистрация:
    16 май 2007
    Сообщения:
    60
    leo
    спс все понял)
    давай я все же попытаюсь обяснить почему
    я написал прогу решенья систем линейных уравнений больших порядков методом итераций(Ланцоша)!
    Она заполняется по шаблону!
    т.е я не ввожу разреженую матрицу вручную! Я задаю шаблон(матрицу) скажем 100*100, а получаю систему 10000*10000 уравнений! LMass - єто размерность матрицы шаблона, а так как она для удобства обрамлена нулями то реальная размерность = размерность - 2 (ноля которыми она обрамлена) вот в принципе и все)