Login
Про многопоточность
1358 просмотров
Перейти к просмотру всей ветки
in Antwort alex445 16.02.22 18:28, Zuletzt geändert 16.02.22 21:28 (wasja-de)
Этими "грязными" штучками баловались с незапамятных времён:2 - просто таблица заготовленных констант для корней из 2, 3 и т.д.
но в современных реалиях они могут привести к отрицательному эффекту :)
Ниже - пример вычисления синусов и косинусов в лоб и точно такой же алгоритм с предвычисленными значениями, которые были сохранены в таблицу. На "удивление", вариант с таблицей работает слегка медленнее, так как в нем происходит случайный доступ по памяти, который просто в сотни раз портит производительность. Распараллеливание на процессорные ядра обоих алгоритмов только усугубит проблему, то есть первый вариант будет работать еще быстрее, а второй - не ускорится (на некоторых компьютерных архитектурах может даже замедлиться).
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N (4*1024*1024)
#define M 32
#if 0 // первый вариант с вычислением синусов в лоб
int main()
{ float s=0.1, c=0.1;
for(int j=0; j for(int i=0; i { float s1, c1;
int pos= lrand48() & (N-1);
sincosf(((float)pos)*0.00001, &s1, &c1);
float s2=s1*c+c1*s;
float c2=c1*c-s1*s;
c=c2; s=s2;
}
printf("%lg %lg\n", c, s);
return 0;
}
#else // метод с предвычисленной таблицей тригонометрических функций
float Sin[N];
float Cos[N];
int main()
{ float s=0.1, c=0.1;
for(int i=0; i sincosf(((float)i)*0.00001, Sin+i, Cos+i);
for(int j=0; j for(int i=0; i { float s1, c1;
int pos= lrand48() & (N-1);
s1=Sin[pos];
c1=Cos[pos];
float s2=s1*c+c1*s;
float c2=c1*c-s1*s;
c=c2; s=s2;
}
printf("%lg %lg\n", c, s);
return 0;
}
#endif