/** * Use of SSE vector units * unroll loop by a factor of 2 */ f32 dp_sse_vec(f32 *x, f32 *y, u32 size) { // we use only one vector but twice f32 v_sum[4]; v_sum[0] = v_sum[1] = v_sum[2] = v_sum[3] = 0.0; u32 i; // loop unrolling by a factor of 2x4 for (i = 0; i < (size & ~7); i += 8) { v_sum[0] += x[i + 0] * y[i + 0]; v_sum[1] += x[i + 1] * y[i + 1]; v_sum[2] += x[i + 2] * y[i + 2]; v_sum[3] += x[i + 3] * y[i + 3]; v_sum[0] += x[i + 4] * y[i + 4]; v_sum[1] += x[i + 5] * y[i + 5]; v_sum[2] += x[i + 6] * y[i + 6]; v_sum[3] += x[i + 7] * y[i + 7]; } // sum of partial sums float sum = v_sum[0] + v_sum[1] + v_sum[2] + v_sum[3]; // last iterations while (i < size) { sum += x[i] * y[i]; ++i; } return sum; }