Message boards :
Cafe :
Технологии ускорения программ, написанных на PARI/GP
Message board moderation
| Author | Message |
|---|---|
Natalia MakarovaSend message Joined: 6 Apr 17 Posts: 16978 Credit: 0 RAC: 0 |
Г. Петухов писал в сообщении https://dxdy.ru/post1625970.html#p1625970 Это относительно тормозного PARI/GP можно получить сотни и тысячи раз (я же получаю как Вам известно), Это об ускорении с использованием ассемблера (АСМ). И далее: А при использовании технологии gp2c и скорость PARI/GP программ можно приблизить к скорости С программ И ещё г. Петухов писал в сообщении https://dxdy.ru/post1628141.html#p1628141 Тогда пока выскажу крамольную для данной темы мысль: чтобы пользоваться ускорением от векторизации (SSE/AVX) вычислений совсем не обязательно изучать ассемблер. Можно изучить С (который похож на известным тут многим PARI/GP) и ещё всего две вещи: векторные структуры данных и векторные команды (что с какими данными они делают). Я насчитала, как минимум, три технологии ускорения программ, написанных на "тормозном PARI/GP". Господа! Кто-нибудь, кроме г. Петухова, владеет хотя бы одной из этих технологий? Допустим, у вас есть рабочая программа, написанная на PARI/GP. Программа прекрасно работает, но скорость оставляет желать много лучшего. Вы можете сделать из этой программы более быструю программу? Для примера программа \\r C:/GRIS/formulae_41_19_17.gp
\l formulae_41_19_17_new_res.txt;
default(parisizemax,10^8);
default(timer,1);
{
\\enter pattern
pt=[0, 6, 12, 30, 42, 72, 90, 96, 120, 126,
132, 156, 162, 180, 210, 222, 240, 246, 252];
pt17=[0, 6, 24, 36, 66, 84, 90, 114, 120, 126, 150, 156, 174, 204, 216, 234, 240];
w=41;
np1=22996961053; print(np1," from number");
np2=22996961054; print(np2," to number");
central=3;
\\ end of data
pl=#pt;
nw=primepi(w);
printf("%d \n",pt);
print("patterns length ",pl);
prs=primes(nw);
period=vecprod(prs);
print(period," period");
vp=vector(np2-np1+1, i, period*(np1-1+i)); lvp=#vp;
printf("search in %d (%.1E) - %d (%.1E)\n",
vp[1],vp[1],vp[lvp]+period,vp[lvp]+period);
cp=vector(central,i,pt[pl\2-central\2+i]);
printf("central %d: %d\n", central,cp);
printf("prove by %d#: ",prs[nw]);print(prs);
vmy=vector(40); pat1=vector(17); pat2=vector(19);
lpr=1;
wd=vector(nw);
for( ip=1,nw,
rip=[];
for( r=1,prs[ip]-1,
for( i=1,pl, if( (r+pt[i])%prs[ip]==0, next(2)));
rip =concat(rip,r) );
lpr=lpr*#rip;
wd[ip]=rip;
); \\for ip
print(lpr," formulae expected");
k=0;
forvec(v=vector(#wd,i,[1,#wd[i]]), k++;
form=lift(chinese( vector( #wd,j,Mod( wd[j][v[j]], prs[j]) ) ));
\\ начало проверки кортежа
foreach(vp,bpp,
bpt=form+bpp;
if(ispseudoprime(bpt+6) && ispseudoprime(bpt+246),
l=0;
forprime(p=bpt+6,bpt+246, l++; vmy[l]=p; );
if(l==17,
for(m=1,17, pat1[m]=vmy[m]-vmy[1]; );
if(pat1[8]==114 && pat1[9]==120 && pat1[10]==126, print(vmy[1],": ",pat1); print(pat1-pt17);
if(pat1==pt17, print(vmy[1],": ",pat1);
);););
);\\ if
if(ispseudoprime(bpt) && ispseudoprime(bpt+252),
l=0;
forprime(p=bpt,bpt+252, l++; vmy[l]=p; );
if(l==19,
for(m=1,19, pat2[m]=vmy[m]-vmy[1]; );
if(pat2[9]==120 && pat2[10]==126 && pat2[11]==132, print(vmy[1],": ",pat2); print(pat2-pt);
if(pat2==pt, print(vmy[1],": ",pat2);
);););
);\\ if
);\\ foreach
\\ конец проверки кортежа
);\\ forvec
}Эта программа в данный момент работает на моём ПК (в один поток). Время работы программы time = 4h, 25min, 57,701 ms. Производительность моего ПК 2,4 Ггц. В программе обрабатывается интервал, равный двум периодам 41#. PS. Часть программы, где формируются формулы для получения кортежей, написал gris; блок проверки кортежей написан мной. |
Natalia MakarovaSend message Joined: 6 Apr 17 Posts: 16978 Credit: 0 RAC: 0 |
Может быть, кто-то может и программу на PARI/GP ускорить (не применяя упомянутые выше технологии привлечения других языков). Замечу, что gris пытался оптимизировать блок проверки кортежей, но... 1) у меня возникли сомнения в его проверке; 2) существенного убыстрения эта оптимизация не дала. |
Natalia MakarovaSend message Joined: 6 Apr 17 Posts: 16978 Credit: 0 RAC: 0 |
Не технология, но приём. Г. Петухов писал в сообщении https://dxdy.ru/post1625620.html#p1625620 А я показывал как добавлением одной строчки можно ускорить программу почти впятеро только за счёт замены части проверок ispseudoprime на setsearch от частного, что оказывается намного быстрее. Так можно (более-менее) ускорить фактически любую программу проверки по паттернам на PARI. Для меня это ёжик в тумане. Что такое "на setsearch от частного"? gris, вы знаете, что это такое и с чем его кушать? :) Тогда надо применить для убыстрения наших программ на PARI/GP. Ведь "можно ускорить программу почти впятеро". Это не хухры-мухры. Вот, например, в нашей программе есть такая проверка if(ispseudoprime(bpt+6) && ispseudoprime(bpt+246), и такая проверка if(ispseudoprime(bpt) && ispseudoprime(bpt+252), И что на что тут надо заменить. чтобы ускорить программу "почти впятеро"? Г. Петухов писал А я показывал ... Где показывал? "Пруф, дайте пруф мне!" :))) Как-то э-э-э... тихо показывал, я и не увидела :) |
©2025 (C) Progger