2016-02-08 3 views
0

Я написал масштаб Мандельброта в C++, но масштаб был ограничен из-за неточности с плавающей запятой. Вот почему я написал все, что связано с библиотекой GMP.Такая же функция? работает примерно на 10 раз медленнее с GMP (C++)

Но теперь у меня проблемы с производительностью. Я новичок в GMP, так может быть, я просто перепутала несколько вещей:

Вот исходный код:

int iterate(double xp, double yp, int iterations){ 
double length = 1; 
double x = 0; 
double y = 0; 
double r; 
for(int i = 0; i < iterations && length <= 2; i++){ 
    double xTemp = x; 
    //calculate real part 
    x = (x*x)+xp-(y*y); 
    //calculate imaginary part 
    y = 2*xTemp*y+yp; 
    //calculate lenth 
    length = sqrt(x*x+y*y); 
    r = i+1; 
} 
if(length > 2) 
    return r; 
return 0; 

}

Та же функция с GMP (я думаю, что это то же самое), Я добавил две переменные, темп и temp2, для хранения значений для расчета, но это не должно делать это в 10 раз медленнее:

int iterateGMP(mpf_t xpGMP, mpf_t ypGMP, int iterations){ 
double r; 

mpf_set_default_prec (20); 

mpf_t length; 
mpf_init(length); 
mpf_set_d(length, 1); 
mpf_t x; 
mpf_init(x); 
mpf_set_d(x, 0); 
mpf_t y; 
mpf_init(y); 
mpf_set_d(y, 0); 
mpf_t xTemp; 
mpf_init(xTemp); 
mpf_t TempGMP; 
mpf_init(TempGMP); 
mpf_t Temp2GMP; 
mpf_init(Temp2GMP); 


for(int i = 0; i < iterations && mpf_cmp_ui(length, 2)<0; i++){ 
    mpf_set(xTemp, x); 

    //calculate real part 
    mpf_mul(TempGMP, x, x); 
    mpf_add(TempGMP, TempGMP, xpGMP); 
    mpf_mul(Temp2GMP, y, y); 
    mpf_sub(x, TempGMP, Temp2GMP); 

    //calculate imaginary part 
    mpf_mul(TempGMP, xTemp, y); 
    mpf_mul_ui(TempGMP, TempGMP, 2); 
    mpf_add(y, TempGMP, ypGMP); 

    //calculate length 
    mpf_mul(TempGMP, x, x); 
    mpf_mul(Temp2GMP, y, y); 
    mpf_add(TempGMP, TempGMP, Temp2GMP); 
    mpf_sqrt(length, TempGMP); 
    r = i+1; 
} 
if(mpf_cmp_ui(length, 2) > 0){ 
    return r; 
} 
return 0; 

}

Надеюсь, кто-то может мне помочь.

+2

Вы включили оптимизацию? 10-кратная потеря производительности не является абсолютно необоснованной для произвольной библиотеки точности. – nwp

+1

Это OT, но вы можете сделать оба кода быстрее, избегая квадратного корня. Просто проверьте (квадрат) длину больше 4. –

+0

@ nwp Как включить оптимизацию? – Joel

ответ

4

Я добавил две переменные, темп и temp2, для хранения значений для расчета, но это не должно сделать это в 10 раз медленнее

Операции на float и double обычно обрабатываются аппаратными средствами. В то время как операции над типами GMP обрабатываются библиотекой GMP в программном обеспечении.

Значения GMP также требуют больше памяти для хранения, а память часто является узким местом.

+0

Проблема в этом случае (цикл Мандельброта) не является дополнительной памятью, это то, что программное обеспечение с расширенной точностью float * много * медленнее, чем аппаратная плавающая точка. Это петля, связанная с задержкой, с теми же данными. –