double x int i i x define DOUBLE
Использование быстрых инструкций Исходный код double x; int i; i = x; Оптимизированный код #define DOUBLE 2 INT(i, d) {double t = ((d) + 6755399441055744. 0); i = *((int *)(&t)); } double x; int i; DOUBLE 2 INT(i, x); !!! 6755399441055744. 0 = 2^52 + 2^51 13
Эффективное использование памяти Исходный код double x[VECLEN], y[VECLEN], z[VECLEN]; unsigned int k; for (k = 1; k < VECLEN; k++) { x[k] = x[k-1] + y[k]; } for (k = 1; k < VECLEN; k++) { x[k] = z[k] * (y[k] - x[k-1]); } 22
Эффективное использование памяти (предвыборка данных) Оптимизированный код for (ii = 0; ii < 100; ii++) { for (jj = 0; jj < 24; jj+=8) { /* N-1 iterations */ _mm_prefetch((char*)&a[ii][jj+8], _MM_HINT_NTA); computation(a[ii][jj]); } _mm_prefetch((char*)a[ii+1][0], _MM_HINT_NTA); computation(a[ii][jj]); /* Last iteration */ } 29
Эффективное использование памяти Исходный код float *memory = new float[4*N]; for(int i=0; i<N; i++) { a = *(memory+i*4); b = *(memory+i*4+1); c = *(memory+i*4+2); *(memory+i*4+3) = func(a, b, c); } 31
- Slides: 32