2016-10-03 2 views
-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() */ 

Я ищу, чтобы оптимизировать цикл. Я попробовал разворот цикла, но это мало что делало. Что еще я могу сделать?

+0

Вы можете получить значительное увеличение производительности с помощью инструкций SIMD, если ваша архитектура поддерживает его ... если вы не против вычислять параллельные суммы и затем горизонтально добавлять в конце. Он меняет порядок добавлений, но это только важно в более экстремальных случаях. Если у вас есть роскошь выбора вашей архитектуры, вам может быть повезло, чтобы использовать некоторые широко широко развернутые инструкции. – paddy

ответ

1

Вы можете попробовать:

double dsdx, dsdy; 
... 
dsdx = DataSet->Data_X[lcv]; 
dsdy = DataSet->Data_y[lcv]; 
S_XX += dsdx * dsdx; 
S_XY += dsdx * dsdy; 
S_X += dsdx; 
S_Y += dsdy; 
... 

Таким образом, вы получите только значения из вашей структуры один раз в каждой итерации цикла.

Смежные вопросы