MSVC++ 7 & inline asm. использование XMM.

Тема в разделе "WASM.A&O", создана пользователем Morozzz, 12 мар 2006.

  1. Morozzz

    Morozzz New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2006
    Сообщения:
    2
    Адрес:
    Россия, Хабаровск
    Собственно функция:
    Код (Text):
    1.  
    2.       xor esi, esi;     //esi - счетчик первого цикла;
    3.       lea ecx, dword ptr DS:[ecx];
    4.  
    5. ii:     xor edi, edi;   //edi - счетчик второго (вложенного) цикла;
    6. jj:
    7.             lea esp, dword ptr ss:[esp];
    8.                
    9.                 mov eax, esi;
    10.                 mov edx, it;
    11.                 add eax, block;
    12.                 add edx, esi;
    13.                 movaps xmm0, [eax];
    14.                 movaps xmm1, [edx+edi];
    15.                 movaps xmm2, [eax+0x10];
    16.                 movaps xmm3, [edx+edi+0x10];
    17.  
    18.                 mulps xmm0, xmm1;
    19.                 movhlps xmm1, xmm0;
    20.                 addps xmm0, xmm1;
    21.                 mulps xmm2, xmm3;
    22.                 movhlps xmm3, xmm2;
    23.                 addps xmm2, xmm3;
    24.  
    25.  
    26.                 movss xmm1, xmm0;
    27.                 psrlq xmm0, 0x20;
    28.                 movss xmm3, xmm2;
    29.                 psrlq xmm2, 0x20;
    30.  
    31.                 addps xmm0, xmm1;
    32.                 mov edx, edi;
    33.                 shr edx, 3;
    34.                 add eax, edx;
    35.                 addps xmm2, xmm3;
    36.                 addss xmm0, xmm2;
    37. //--------------------------------------------------//
    38.                 movss [eax], xmm0;
    39. //--------------------------------------------------//
    40.                
    41.             add edi, 0x20;
    42.             cmp edi, 0x100;
    43.             jl short jj;
    44.         add esi, 0x20;
    45.         cmp esi, 0x100;
    46.         jl short ii;
    47.  


    "it" и "block" - указатели на массивы float-ов. it указывает на начало массива коэффициентов, block - массива исходных данных. Массивы выравнены на границу, кратную 16.



    Собственно, суть проблемы:

    Если убрать выгрузку значения в память (последний movss), функция работает достаточно быстро. (примерно 0.5 мкс)

    Если оставить все как есть - примерно 2.5 мкс! В 5 раз дольше!

    То ли лыжи не едут, то ли...
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Morozzz

    Классическое нарушение условия store-to-load forwarding: movss записывает в память 4 байта, а в следующем цикле movaps пытаются читать два блока по 16, содержащие только-что "записанное" значение, которое на самом деле сидит в буфере записи и ждет отставки микрооперации, чтобы только потом попасть в кэш - соответсвенно отдыхают и movaps
     
  3. Morozzz

    Morozzz New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2006
    Сообщения:
    2
    Адрес:
    Россия, Хабаровск
    leo

    Недоразумение уже устранено. Спасибо за разъяснение!