b"\n_START_ARTICLE_\nStreaming SIMD Extensions\n_START_SECTION_\nIstruzioni SSE\n_START_PARAGRAPH_\nSSE introduce sia operazioni su scalari singoli sia su gruppi di numeri in virgola mobile (packed).\n_START_SECTION_\nEsempi\n_START_PARAGRAPH_\nGli esempi che seguono dimostrano il vantaggio di usare le istruzioni SSE. Consideriamo una operazione come la somma di vettori, che si usa molto spesso nella computer grafica; sommare due vettori a precisione singola con 4 componenti ciascuno richiede quattro istruzioni di somma floating point in un normale processore x86:_NEWLINE_vec_res.x = v1.x + v2.x;_NEWLINE_vec_res.y = v1.y + v2.y;_NEWLINE_vec_res.z = v1.z + v2.z;_NEWLINE_vec_res.w = v1.w + v2.w;_NEWLINE_Queste quattro righe diventano altrettante istruzioni FADD nel codice oggetto compilato. Con le istruzioni SSE invece, come si vede dal codice che segue, basta una sola istruzione 'packed-add' a 128 bit per eseguire il calcolo._NEWLINE_movaps xmm0,address-of-v1          ;xmm0=v1.w | v1.z | v1.y | v1.xaddps xmm0,address-of-v2           ;xmm0=v1.w+v2.w | v1.z+v2.z | v1.y+v2.y | v1.x+v2.x\n_START_SECTION_\nDifferenze fra x87 FPU e SSE\n_START_PARAGRAPH_\nLe istruzioni FPU (x87) di solito memorizzano i risultati con 80 bit di precisione. Quando vecchi algoritmi scritti per le FPU x87 vengono adattati alle nuove estensioni SSE, che supportano solo 64 bit di precisione, alcune combinazioni di operazioni aritmetiche e insiemi di dati possono dare luogo a differenze numeriche significative: questo \xc3\xa8 molto importante nei calcoli scientifici, se il calcolo deve essere confrontato con risultati ottenuti su altre architetture hardware._NEWLINE_A seconda di quale interprete o compilatore viene usato e di quali ottimizzazioni vengono scelte, pu\xc3\xb2 essere necessario salvare temporaneamente certi dati e ricaricarli pi\xc3\xb9 tardi; normalmente anche i risultati della FPU x87 vengono arrotondati a 64 o a 32 bit, ma il luogo e il momento esatto in cui questo avviene pu\xc3\xb2 causare differenze nell'esito finale dei calcoli. Il seguente esempio di codice in Fortran 95 ne fornisce la prova: il valore corretto del terzo e ultimo numero da stampare \xc3\xa8 zero._NEWLINE_program ciao_NEWLINE_real a,b,c,d_NEWLINE_real x,y,z_NEWLINE_a=.013_NEWLINE_b=.027_NEWLINE_c=.0937_NEWLINE_d=.79_NEWLINE_y=-a/b + (a/b+c)*EXP(d)_NEWLINE_print *,y_NEWLINE_z=(-a)/b + (a/b+c)*EXP(d)_NEWLINE_print *,z_NEWLINE_x=y-z_NEWLINE_print *,x_NEWLINE_end_NEWLINE_Compilando con le istruzioni FPU x87 ed eseguendo si ottiene:_NEWLINE_# g95 -o hi -mfpmath=387 -fzero -ftrace=full -fsloppy-char hi.for_NEWLINE_# ./hi_NEWLINE_ 0.78587145_NEWLINE_ 0.7858714_NEWLINE_ 5.9604645E-8_NEWLINE_Compilando usando le estensioni SSE ed eseguendo si ottiene:_NEWLINE_# g95 -o hi -mfpmath=sse -msse2 -fzero -ftrace=full -fsloppy-char hi.for_NEWLINE_# ./hi_NEWLINE_ 0.78587145_NEWLINE_ 0.78587145_NEWLINE_ 0."