Собственно функция: Код (Text): xor esi, esi; //esi - счетчик первого цикла; lea ecx, dword ptr DS:[ecx]; ii: xor edi, edi; //edi - счетчик второго (вложенного) цикла; jj: lea esp, dword ptr ss:[esp]; mov eax, esi; mov edx, it; add eax, block; add edx, esi; movaps xmm0, [eax]; movaps xmm1, [edx+edi]; movaps xmm2, [eax+0x10]; movaps xmm3, [edx+edi+0x10]; mulps xmm0, xmm1; movhlps xmm1, xmm0; addps xmm0, xmm1; mulps xmm2, xmm3; movhlps xmm3, xmm2; addps xmm2, xmm3; movss xmm1, xmm0; psrlq xmm0, 0x20; movss xmm3, xmm2; psrlq xmm2, 0x20; addps xmm0, xmm1; mov edx, edi; shr edx, 3; add eax, edx; addps xmm2, xmm3; addss xmm0, xmm2; //--------------------------------------------------// movss [eax], xmm0; //--------------------------------------------------// add edi, 0x20; cmp edi, 0x100; jl short jj; add esi, 0x20; cmp esi, 0x100; jl short ii; "it" и "block" - указатели на массивы float-ов. it указывает на начало массива коэффициентов, block - массива исходных данных. Массивы выравнены на границу, кратную 16. Собственно, суть проблемы: Если убрать выгрузку значения в память (последний movss), функция работает достаточно быстро. (примерно 0.5 мкс) Если оставить все как есть - примерно 2.5 мкс! В 5 раз дольше! То ли лыжи не едут, то ли...
Morozzz Классическое нарушение условия store-to-load forwarding: movss записывает в память 4 байта, а в следующем цикле movaps пытаются читать два блока по 16, содержащие только-что "записанное" значение, которое на самом деле сидит в буфере записи и ждет отставки микрооперации, чтобы только потом попасть в кэш - соответсвенно отдыхают и movaps