SIMD 2(SSE2) SAXPY/DAXPY 2.0 2000 7 : 248600J-001 01/12/06 1
305-8603 115 Fax: 0120-47-8832 * Copyright Intel Corporation 1999, 2000 01/12/06 2
1...5 2 SAXPY DAXPY...5 2.1 SAXPY DAXPY...6 2.1.1 SIMD C++...6 2.1.2 C/C++...7 3...8 4...8 5 C/C++...9 6 SSE2 C++...10 7 SSE2...11 A -... A-1... A-1... A-2 01/12/06 3
2.0 Pentium 4 2000 7 1.0 1999 9 Lawson Hanson Kincaid Krogh Basic linear algebra subprograms for Fortran usage ACM Transactions on Mathematical Software Vol. 5 No. 3 308 371 Dongarra Moler Bunch Stewart LINPACK User's Guide SIAM 1979 C++ SIMD 693500J 1999 C/C++ 741901J 1999 01/12/06 4
1 SIMD 2(SSE2 Streaming SIMD Extensions 2) SIMD(Single Instruction Multiple Data) SIMD IA-32 SIMD SIMD (SSE) SIMD 128 SIMD 64 SIMD 3D (3D) / SAXPY/DAXPY / SSE2 SSE Pentium 4 Pentium III SAXPY DAXPY SAXPY(DAXPY) SAXPY(DAXPY) ( ) (IA) SIMD SAXPY(DAXPY) SIMD C++ C/C++ 1 16 SAXPY(DAXPY) C/C++ SIMD 2 SAXPY DAXPY SAXPY(DAXPY) Lawson Hanson Kincaid Krogh BLAS(Basic Linear Algebra Subprograms)[Lawson, 1979] SAXPY (SA) X Y DAXPY Y = a * X + Y X Y ( 1 n) a FORTRAN 01/12/06 5
CALL SAXPY (N, A, X, INCX, Y, INCY) N INCX INCY SAXPY X Y 2 INCX=INCY=1 LINPACK BLAS INCX=INCY=1 [Dongarra, 1979] LINPACK BLAS SAXPY DAXPY SIMD INCX=INCY=1 SAXPY DAXPY C++ 2.1 SAXPY DAXPY SSE2 C/C++ C/C++ 2 1 SIMD C++ SSE2 1 C/C++ 2 2 2.1.1 SIMD C++ FVEC DVEC 16 float(double) F32vec4(F64vec2) x y F32vec4(F64vec2) y[i] = scalar * x[i] + y[i] 128 4(2) n 4(2) sa(da) 1 sa(da) 4(2) 1 16 float(double) F32vec4(F64vec2) x y 2 01/12/06 6
x y 1 C/C++ declspec ( C/C++ ) x y 2 if SAXPY(DAXPY) 2.1.2 C/C++ 30 SAXPY(DAXPY) C/C++ /QxK /QxW SSE SSE2 /Qvec_verbose3 SAXPY(DAXPY) C/C++ SAXPY( DAXPY) C/C++ FORTRAN /Qvec_verbose3 2 ivdep pragma for pragma 4(2) vector aligned pragma C/C++ ivdep vector aligned 2 pragma SAXPY DAXPY pragma 1 C/C++ novector pragma 1 /QxW /QaxW /QxW SSE2( Pentium III ) Pentium 4 IA SSE2 /QaxW SSE2 2 1 /QxW 01/12/06 7
SSE2 1 /QxW SSE2 2 1 3 SSE2 FVEC(DVEC) SIMD C++ C/C++ FVEC(DVEC) ( ) C/C++ SSE SSE2 (SSE 4 SSE2 2 ) SAXPY SSE 4 Pentium 4 Pentium III 2 SSE DAXPY SSE2 4 SSE SSE2 SIMD 2 (1)SIMD C++ ( C/C++ ) (2) C/C++ pragma Itanium TM (2) 01/12/06 8
5 C/C++ * *Saxpy from BLAS, Lawson, Manson, Kincaid, and Krogh (1979) * *this compilation from _Linpack Users' Guide_, Dongarra, Moler, * Bunch, & Stewart, Siam 1979, appendix A. * *These versions are "unit" saxpy (daxpy), meaning they assume stride = 1. *(note that this is what BLAS requires, and is the most common form) * * Assume all vectors are aligned. * */ void usaxpy (int n, float sa, float *sx, float *sy) { if (sa == 0.0) return; } //The latest intel compilers can now vectorize this loop. //Use the novector pragma to prevent vectorization. #pragma novector for (int i = 0; i < n; i++) sy[i] = sa * sx[i] + sy[i]; void udaxpy (int n, double da, double *dx, double *dy) { if (da == 0.0) return; //The latest intel compilers can now vectorize this loop. //Use the novector pragma to prevent vectorization. #pragma novector for (int i = 0; i < n; i++) dy[i] = da * dx[i] + dy[i]; } 01/12/06 9
6 SSE2 C++ /* Assumes vectors are aligned, and that the vector length n is divisible * by 4 for saxpy and 2 for daxpy. */ #include <fvec.h> #include <dvec.h> void usaxpy_fvec (int n, float sa, float *sx, float *sy) { F32vec4 *x = (F32vec4 *)sx, *y = (F32vec4 *)sy; F32vec4 a(sa); if (sa == 0.0) return; n >>= 2; for (int i = 0; i < n; i++) y[i] = a * x[i] + y[i]; } void udaxpy_dvec (int n, double da, double *dx, double *dy) { F64vec2 *x = (F64vec2 *) dx, *y = (F64vec2 *) dy; F64vec2 a(da); if (da == 0.0) return; n >>= 1; for (int i = 0; i < n; i++) y[i] = a * x[i] + y[i]; } 01/12/06 10
7 SSE2 /* Assumes vectors are aligned */ void usaxpy_vec (int n, float sa, float *sx, float *sy) { if (sa == 0.0) return; #pragma ivdep #pragma vector aligned for (int i = 0; i < n; i++) sy[i] = sa * sx[i] + sy[i]; } void udaxpy_vec (int n, double da, double *dx, double *dy) { if (da == 0.0) return; #pragma ivdep #pragma vector aligned for (int i = 0; i < n; i++) dy[i] = da * dx[i] + dy[i]; } 01/12/06 11
A - 2.0 1.20 GHz Pentium 4 2000 7 1.0 1999 9 1:SAXPY/DAXPY ( MFLOPS) Pentium III (733 MHz) SAXPY: C 360 523 SAXPY: FVEC 837 1932 SAXPY: 865 1476 DAXPY: C 353 640 DAXPY: DVEC N/A 951 DAXPY: N/A 672 Pentium 4 (1.20 GHz) 1 1 733 MHz Pentium III 1.20 GHz Pentium 4 A-2 2 ( ) FLOPS SAXPY SIMD (SSE) 4 Pentium III 2 Pentium 4 3.7 SSE 1.9 GFLOPS DAXPY SSE2 1.5 951 MFLOPS DAXPY 1 SIMD 2 SAXPY 4 01/12/06 A-1
2: Pentium III Pentium III (733 MHz) Desktop Board VC820 BIOS VC82010A.86A.0028.P10 2 256 KB 128 MB RDRAM PC800-45 Ultra ATA 6.00.012 IBM DJNA-371800 ATA-66 Creative Labs 3D Blaster Annihilator Pro AGP nvidia GeForce256 DDR 32MB Nvidia Reference Driver 5.22 Windows 2000 2195 3: Pentium 4 Pentium 4 (1.20 GHz) Desktop Board D850GB BIOS GB85010A.86A.0014.D.0007201756 2 256 KB 128 MB RDRAM PC800-45 Ultra ATA 6.00.012 IBM DJNA-371800 ATA-66 / Creative Labs 3D Blaster Annihilator Pro AGP nvidia GeForce256 DDR 32MB NVidia Reference Driver 5.22 Windows 2000 2195 01/12/06 A-2