// Computes part of matrix.vector v = Wu. Computes 1 result. static void PartialMatrixDotVector1(const int8_t* wi, const double* scales, const int8_t* u, int num_in, double* v) { double total = IntDotProductSSE(u, wi, num_in); // Add in the bias and correct for integer values. *v = (total / INT8_MAX + wi[num_in]) * *scales; }
void WeightMatrix::MatrixDotVector(const inT8* u, double* v) const { ASSERT_HOST(int_mode_); int num_out = wi_.dim1(); int num_in = wi_.dim2() - 1; for (int i = 0; i < num_out; ++i) { const inT8* Wi = wi_[i]; int total = 0; if (SIMDDetect::IsSSEAvailable()) { total = IntDotProductSSE(u, Wi, num_in); } else { for (int j = 0; j < num_in; ++j) total += Wi[j] * u[j]; } // Add in the bias and correct for integer values. v[i] = (static_cast<double>(total) / MAX_INT8 + Wi[num_in]) * scales_[i]; } }