-2
У меня есть следующие функции для расчета коэффициентов:Оптимизация контура C
void CalculateCoefficients(LinearFit *DataSet, double *A, double *B)
{
/* Declare and initialize sum variables */
double S_XX = 0.0;
double S_XY = 0.0;
double S_X = 0.0;
double S_Y = 0.0;
int lcv;
/* Compute the sums */
for (lcv=0; lcv < DataSet->NextElement; lcv++)
{
S_XX += DataSet->Data_X[lcv] * DataSet->Data_X[lcv];
S_XY += DataSet->Data_X[lcv] * DataSet->Data_Y[lcv];
S_X += DataSet->Data_X[lcv];
S_Y += DataSet->Data_Y[lcv];
} /* for() */
/* Compute the parameters of the line Y = A*X + B */
(*A) = (((DataSet->NextElement * S_XY) - (S_X * S_Y))/((DataSet->NextElement * S_XX) - (S_X * S_X)));
(*B) = (((S_XX * S_Y) - (S_XY * S_X))/((DataSet->NextElement * S_XX) - (S_X * S_X)));
} /* CalculateCoefficients() */
Я ищу, чтобы оптимизировать цикл. Я попробовал разворот цикла, но это мало что делало. Что еще я могу сделать?
Вы можете получить значительное увеличение производительности с помощью инструкций SIMD, если ваша архитектура поддерживает его ... если вы не против вычислять параллельные суммы и затем горизонтально добавлять в конце. Он меняет порядок добавлений, но это только важно в более экстремальных случаях. Если у вас есть роскошь выбора вашей архитектуры, вам может быть повезло, чтобы использовать некоторые широко широко развернутые инструкции. – paddy