Технологии ускорения программ, написанных на PARI/GP

Message boards : Cafe : Технологии ускорения программ, написанных на PARI/GP
Message board moderation

To post messages, you must log in.

AuthorMessage
Profile Natalia Makarova
Project scientist
Avatar

Send message
Joined: 6 Apr 17
Posts: 13219
Credit: 0
RAC: 0
Message 13550 - Posted: 5 Feb 2024, 3:43:26 UTC
Last modified: 5 Feb 2024, 5:19:24 UTC

Г. Петухов писал в сообщении
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; блок проверки кортежей написан мной.
ID: 13550 · Rating: 0 · rate: Rate + / Rate - Report as offensive     Reply Quote
Profile Natalia Makarova
Project scientist
Avatar

Send message
Joined: 6 Apr 17
Posts: 13219
Credit: 0
RAC: 0
Message 13552 - Posted: 5 Feb 2024, 4:30:33 UTC

Может быть, кто-то может и программу на PARI/GP ускорить (не применяя упомянутые выше технологии привлечения других языков).

Замечу, что gris пытался оптимизировать блок проверки кортежей, но...
1) у меня возникли сомнения в его проверке;
2) существенного убыстрения эта оптимизация не дала.
ID: 13552 · Rating: 0 · rate: Rate + / Rate - Report as offensive     Reply Quote
Profile Natalia Makarova
Project scientist
Avatar

Send message
Joined: 6 Apr 17
Posts: 13219
Credit: 0
RAC: 0
Message 13565 - Posted: 7 Feb 2024, 4:23:58 UTC
Last modified: 7 Feb 2024, 4:33:45 UTC

Не технология, но приём.

Г. Петухов писал в сообщении
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),

И что на что тут надо заменить. чтобы ускорить программу "почти впятеро"?

Г. Петухов писал
А я показывал ...

Где показывал?
"Пруф, дайте пруф мне!" :)))
Как-то э-э-э... тихо показывал, я и не увидела :)
ID: 13565 · Rating: 0 · rate: Rate + / Rate - Report as offensive     Reply Quote

Message boards : Cafe : Технологии ускорения программ, написанных на PARI/GP


©2024 (C) Progger