Ответ: Умножение типов double появилось только в SSE2. До этого SSE, как и MMX годились только для графики, где на целый пиксел можно ошибаться. Но и после этого стало не слишком лучше. Пока затолкаешь в SSE-регистры, да пока выгребешь, больше шагов потратишь, чем на FFP. Кроме того, продукт от двух double-операндов в FFP имеет большую разрядность - long double (10 байтное представление), что и позволяет в нем накапливать суммы без округления, а на SSE2 стразу получается результат, усеченный до double. А уж параллельность эту использовать и подавно замучишься.
Если вы не сошласны, то приведите пожалуйста код суммирования N элементов массива типа double. Т.е. код функции double sum( double *array, int N) на ассемблере, с использованием SSE2. А потом сравним чья быстрее работает.
Моя выглядит так:
PUBLIC sum
_sum PROC
push ebp
mov ebp, esp
push ebx
mov ebx, [ebp+8] ;array
mov ecx, [ebp+12d] ;N
fldz
jecxz short bypass
cycle: fadd qword ptr [ebx]
add ebx, 8
loop cycle
bypass:
pop ebx
pop ebp
ret
_sum ENDP
Собственно в самом цикле всего 3 строчки:
cycle: fadd qword ptr [ebx]
add ebx, 8
loop cycle