Message boards :
Cafe :
Технологии ускорения программ, написанных на PARI/GP
Message board moderation
Author | Message |
---|---|
Send message Joined: 6 Apr 17 Posts: 13219 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; блок проверки кортежей написан мной. |
Send message Joined: 6 Apr 17 Posts: 13219 Credit: 0 RAC: 0 |
Может быть, кто-то может и программу на PARI/GP ускорить (не применяя упомянутые выше технологии привлечения других языков). Замечу, что gris пытался оптимизировать блок проверки кортежей, но... 1) у меня возникли сомнения в его проверке; 2) существенного убыстрения эта оптимизация не дала. |
Send message Joined: 6 Apr 17 Posts: 13219 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), И что на что тут надо заменить. чтобы ускорить программу "почти впятеро"? Г. Петухов писал А я показывал ... Где показывал? "Пруф, дайте пруф мне!" :))) Как-то э-э-э... тихо показывал, я и не увидела :) |
©2024 (C) Progger