2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу Пред.  1, 2, 3  След.
 
 Re: кортежи последовательных простых. ключ к 19-252
Сообщение25.08.2025, 20:07 
60% идеала тоже неплохо. Значит или под виндой это плохо работает, или лично у меня.

 
 
 
 Re: кортежи последовательных простых. ключ к 19-252
Сообщение25.08.2025, 21:19 
Аватара пользователя
Dmitriy40 в сообщении #1699649 писал(а):
60% идеала тоже неплохо. Значит или под виндой это плохо работает, или лично у меня.

Насколько я понял из прочтения этого треда, проблема именно в mingw-версии PARI/GP.

 
 
 
 Re: кортежи последовательных простых. ключ к 19-252
Сообщение25.08.2025, 22:00 
Тестовый код оттуда и у меня работает хорошо, практически в 4 раза, как и должно быть:
Код:
        GP/PARI CALCULATOR Version 2.13.4 (released)
amd64 running mingw (x86-64/GMP-6.1.2 kernel) 64-bit version
compiled: Mar 25 2022, gcc version 8.3-posix 20190406 (GCC)
                  threading engine: pthread
parisize = 8000000, primelimit = 51000000, nbthreads = 4
? func2(a,b)=  abs(  prodeuler(X=2,10000,1/( 1-1/X^(1+(a+b)*2*Pi*I/log(2))))  );
? export(func2);
? parfor (count=1, , func2(1e35,count)>5 , r, if (r, return (count)))
cpu time = 31,153 ms, real time = 8,052 ms.


-- 25.08.2025, 22:07 --

Хотя однопоточный gp64 всё равно лучше, за 15с.

 
 
 
 Re: кортежи последовательных простых. ключ к 19-252
Сообщение25.08.2025, 22:31 
Dmitriy40 в сообщении #1699563 писал(а):
Вы видите ускорение счёта в 4 раза? Я вот вижу замедление раз так в 5-6! При почти полной загрузке всех ядер и не пойми зафига вызываемым арбитраже (через ядро).

У меня в WSL2 (Ubuntu 24.04.2 LTS, pari/gp 2.17.2, threading engine: pthread, nbthreads = 8) ваш код с заменой for на parfor замедляется ещё больше, при этом все 8 потоков загружены.
Код:
? stop=precprime(10^7);export(stop);t0=getwalltime();for(a=1,stop-1,my(x);x=lift(chinese(Mod(1,9699690),Mod(1,stop)));if(ispseudoprime(x),print(x)););print("Time: ",strtime(getwalltime()-t0));
Time: 9,384 ms
cpu time = 9,384 ms, real time = 9,384 ms.
? stop=precprime(10^7);export(stop);t0=getwalltime();parfor(a=1,stop-1,my(x);x=lift(chinese(Mod(1,9699690),Mod(1,stop)))
;if(ispseudoprime(x),print(x)););print("Time: ",strtime(getwalltime()-t0));
Time: 5min, 57,571 ms
cpu time = 2min, 47,693 ms, real time = 5min, 57,573 ms.
?

9 секунд for против 360 секунд. Почти в 40 раз :mrgreen:

 
 
 
 Re: кортежи последовательных простых. ключ к 19-252
Сообщение25.08.2025, 23:24 
Аватара пользователя
wrest, используйте сбалансированный код.

 
 
 
 Re: кортежи последовательных простых. ключ к 19-252
Сообщение26.08.2025, 11:03 
maxal в сообщении #1699663 писал(а):
используйте сбалансированный код.

(Оффтоп)

Я просто запустил код Dmitriy40 под WSL2 (не WSL) чтобы посмотреть есть ли разница с его mingw.
"Эталонный код" который у Dmitriy40 даёт ускорение почти в 4 раза, у меня в WSL2 тоже ускоряется по количеству потоков ( почти в 8 раз).

Мне обёртка в mingw не нравится концептуально, поэтому я использую WSL2, если на компе. Хотя в файле по ссылке что вы дали советуют первую версию WSL, но мне кажется что это совет устарел. Но настаивать не буду - не тестировал сам.
Но т.к. я использую pari/gp для дилетанстких целей, то пишу скрипты и запускаю в основном на планшете, arm64 и в один поток. В принципе, меня однопоточная производительность современных snapdragon вполне устраивает. Код исполняется ядром линукс нативно, без java-машины андроида. Но вот можно ли собрать многопоток не знаю (не уверен что можно). Я изначально собирал pari/gp на планшете сам, но потом добрые люди взялись выкладывать в репозиторий, так что я беру что дают.

 
 
 
 Re: кортежи последовательных простых. ключ к 19-252
Сообщение26.08.2025, 12:32 
wrest в сообщении #1699688 писал(а):
maxal в сообщении #1699663 писал(а):
используйте сбалансированный код.

(Оффтоп)

...
Но т.к. я использую pari/gp для дилетанстких целей, то пишу скрипты и запускаю в основном на планшете, arm64 и в один поток.
...
Но вот можно ли собрать многопоток не знаю (не уверен что можно). Я изначально собирал pari/gp на планшете сам, но потом добрые люди взялись выкладывать в репозиторий, так что я беру что дают.
Из моих наблюдений под катом:

(Оффтоп)

На юниксе, например FreeBSD, если собираешь компиляцией из порта и не меняя настроек, то всегда получался многопоточная версия.
Код:
/usr/local/bin/gp-2.9
                                                       GP/PARI CALCULATOR Version 2.9.3 (released)
                                             amd64 running freebsd (x86-64/GMP-6.1.2 kernel) 64-bit version
                        compiled: Jul 31 2022, FreeBSD clang version 5.0.1 (tags/RELEASE_501/final 320880) (based on LLVM 5.0.1)
                                                                threading engine: pthread
                                                     (readline v7.0 enabled, extended help enabled)

                                                         Copyright (C) 2000-2017 The PARI Group

PARI/GP is free software, covered by the GNU General Public License, and comes WITHOUT ANY WARRANTY WHATSOEVER.

Type ? for help, \q to quit.
Type ?15 for how to get moral (and possibly technical) support.

parisize = 8000000, primelimit = 500000, nbthreads = 16

uname -a
FreeBSD teo 11.1-STABLE FreeBSD 11.1-STABLE #0: Mon Feb 19 17:02:43 MSK 2018     demis@teo:/usr/obj/usr/src/sys/GENERIC  amd64
На линуксе, под убунтой, что 20.04, что 22.04, что 24.04 - вроде аналогично было.
Убунту на arm процессоре, кажется (подзабыл), также собиралась.
Если не компилировать (не собирать), а именно установить пакетом, вроде тоже так было.
На андроиде не пробовал.

 
 
 
 Re: кортежи последовательных простых. ключ к 19-252
Сообщение26.08.2025, 12:56 
wrest

(Оффтоп)

А запустите пожалуйста код
Код:
\\default(nbthreads,1);
nth=default(nbthreads); stop=precprime(10^8); export(stop,nth); t0=getwalltime(); n=0;
parfor(th=1,nth, my(x,y=0,a); forstep(a=th,stop-1,nth, if(ispseudoprime(lift(chinese(Mod(1,9699690),Mod(a,stop)))), y++); ); y, r,n+=r);
print("n=",n,"/",stop-1,", nth=",nth,", time: ",strtime(getwalltime()-t0));
в двух вариантах, сначала в показанном, потом с раскомментированной первой строкой (чтобы в один поток). У меня вывод такой:
n=17468130/99999988, nth=4, time: 2min, 52,561 ms
n=17468130/99999988, nth=1, time: 5min, 7,304 ms
Запуск в однопочточной х64 версии:
n=17468130/99999988, nth=1, time: 2min, 17,973 ms
Здесь ручное деление на подзадачи, выполняемые параллельно, и они сделаны максимально большими. По другому этот цикл уже похоже не улучшить если только совсем не менять алгоритм.

 
 
 
 Re: кортежи последовательных простых. ключ к 19-252
Сообщение26.08.2025, 16:04 
Пример по скорости у меня на винде под катом:

(Оффтоп)

Dmitriy40 в сообщении #1699697 писал(а):
А запустите пожалуйста код:

\\default(nbthreads,1);
nth=default(nbthreads); stop=precprime(10^8); export(stop,nth); t0=getwalltime(); n=0;
parfor(th=1,nth, my(x,y=0,a); forstep(a=th,stop-1,nth, if(ispseudoprime(lift(chinese(Mod(1,9699690),Mod(a,stop)))), y++); ); y, r,n+=r);
print("n=",n,"/",stop-1,", nth=",nth,", time: ",strtime(getwalltime()-t0));
в двух вариантах, сначала в показанном, потом с раскомментированной первой строкой (чтобы в один поток).


Код:
1 far
gppthread64-2-17-2.exe test.gp
                                            GP/PARI CALCULATOR Version 2.17.2 (released)
                              amd64 running mingw (x86-64/GMP-6.1.2 kernel) 64-bit version
                                   compiled: Feb 28 2025, gcc version 12-posix (GCC)
                                       threading engine: pthread, nbthreads = 28
                                   (readline not compiled in, extended help enabled)

                                         Copyright (C) 2000-2024 The PARI Group

PARI/GP is free software, covered by the GNU General Public License, and comes WITHOUT ANY WARRANTY WHATSOEVER.

Type ? for help, \q to quit.
Type ?18 for how to get moral (and possibly technical) support.

parisize = 8000000, primelimit = 1048576, factorlimit = 1048576
n=17468130/99999988, nth=28, time: 39,534 ms
?
===
2 far
                                      GP/PARI CALCULATOR Version 2.17.2 (released)
                              amd64 running mingw (x86-64/GMP-6.1.2 kernel) 64-bit version
                                   compiled: Feb 28 2025, gcc version 12-posix (GCC)
                                       threading engine: pthread, nbthreads = 28
                                   (readline not compiled in, extended help enabled)

                                         Copyright (C) 2000-2024 The PARI Group

PARI/GP is free software, covered by the GNU General Public License, and comes WITHOUT ANY WARRANTY WHATSOEVER.

Type ? for help, \q to quit.
Type ?18 for how to get moral (and possibly technical) support.

parisize = 8000000, primelimit = 1048576, factorlimit = 1048576
n=17468130/99999988, nth=28, time: 43,388 ms
?
===
3 removed comment first line
                                      GP/PARI CALCULATOR Version 2.17.2 (released)
                              amd64 running mingw (x86-64/GMP-6.1.2 kernel) 64-bit version
                                   compiled: Feb 28 2025, gcc version 12-posix (GCC)
                                       threading engine: pthread, nbthreads = 28
                                   (readline not compiled in, extended help enabled)

                                         Copyright (C) 2000-2024 The PARI Group

PARI/GP is free software, covered by the GNU General Public License, and comes WITHOUT ANY WARRANTY WHATSOEVER.

Type ? for help, \q to quit.
Type ?18 for how to get moral (and possibly technical) support.

parisize = 8000000, primelimit = 1048576, factorlimit = 1048576
n=17468130/99999988, nth=1, time: 2min, 33,270 ms
?
===
4 removed comment first line
                                      GP/PARI CALCULATOR Version 2.17.2 (released)
                              amd64 running mingw (x86-64/GMP-6.1.2 kernel) 64-bit version
                                   compiled: Feb 28 2025, gcc version 12-posix (GCC)
                                       threading engine: pthread, nbthreads = 28
                                   (readline not compiled in, extended help enabled)

                                         Copyright (C) 2000-2024 The PARI Group

PARI/GP is free software, covered by the GNU General Public License, and comes WITHOUT ANY WARRANTY WHATSOEVER.

Type ? for help, \q to quit.
Type ?18 for how to get moral (and possibly technical) support.

parisize = 8000000, primelimit = 1048576, factorlimit = 1048576
n=17468130/99999988, nth=1, time: 2min, 33,270 ms
?
===
5 cmd (start "" gppthread64-2-17-2.exe test.gp)
                                      GP/PARI CALCULATOR Version 2.17.2 (released)
                              amd64 running mingw (x86-64/GMP-6.1.2 kernel) 64-bit version
                                   compiled: Feb 28 2025, gcc version 12-posix (GCC)
                                       threading engine: pthread, nbthreads = 28
                                   (readline not compiled in, extended help enabled)

                                         Copyright (C) 2000-2024 The PARI Group

PARI/GP is free software, covered by the GNU General Public License, and comes WITHOUT ANY WARRANTY WHATSOEVER.

Type ? for help, \q to quit.
Type ?18 for how to get moral (and possibly technical) support.

parisize = 8000000, primelimit = 1048576, factorlimit = 1048576
n=17468130/99999988, nth=1, time: 2min, 23,954 ms
?
===
6 cmd (start "" gppthread64-2-17-2.exe test.gp)
                                      GP/PARI CALCULATOR Version 2.17.2 (released)
                              amd64 running mingw (x86-64/GMP-6.1.2 kernel) 64-bit version
                                   compiled: Feb 28 2025, gcc version 12-posix (GCC)
                                       threading engine: pthread, nbthreads = 28
                                   (readline not compiled in, extended help enabled)

                                         Copyright (C) 2000-2024 The PARI Group

PARI/GP is free software, covered by the GNU General Public License, and comes WITHOUT ANY WARRANTY WHATSOEVER.

Type ? for help, \q to quit.
Type ?18 for how to get moral (and possibly technical) support.

parisize = 8000000, primelimit = 1048576, factorlimit = 1048576
n=17468130/99999988, nth=1, time: 2min, 24,063 ms
?
===
7 far
gppthread64-2-17-2.exe test.gp
                                             GP/PARI CALCULATOR Version 2.17.2 (released)
                              amd64 running mingw (x86-64/GMP-6.1.2 kernel) 64-bit version
                                   compiled: Feb 28 2025, gcc version 12-posix (GCC)
                                       threading engine: pthread, nbthreads = 28
                                   (readline not compiled in, extended help enabled)

                                         Copyright (C) 2000-2024 The PARI Group

PARI/GP is free software, covered by the GNU General Public License, and comes WITHOUT ANY WARRANTY WHATSOEVER.

Type ? for help, \q to quit.
Type ?18 for how to get moral (and possibly technical) support.

parisize = 8000000, primelimit = 1048576, factorlimit = 1048576
n=17468130/99999988, nth=1, time: 2min, 33,109 ms
?
===
8 (start "" gppthread64-2-17-2.exe test.gp)
                                      GP/PARI CALCULATOR Version 2.17.2 (released)
                              amd64 running mingw (x86-64/GMP-6.1.2 kernel) 64-bit version
                                   compiled: Feb 28 2025, gcc version 12-posix (GCC)
                                       threading engine: pthread, nbthreads = 28
                                   (readline not compiled in, extended help enabled)

                                         Copyright (C) 2000-2024 The PARI Group

PARI/GP is free software, covered by the GNU General Public License, and comes WITHOUT ANY WARRANTY WHATSOEVER.

Type ? for help, \q to quit.
Type ?18 for how to get moral (and possibly technical) support.

parisize = 8000000, primelimit = 1048576, factorlimit = 1048576
n=17468130/99999988, nth=1, time: 2min, 24,063 ms
?
===
9 far (gppthread64-2-17-2.exe test.gp)
                                      GP/PARI CALCULATOR Version 2.17.2 (released)
                              amd64 running mingw (x86-64/GMP-6.1.2 kernel) 64-bit version
                                   compiled: Feb 28 2025, gcc version 12-posix (GCC)
                                       threading engine: pthread, nbthreads = 28
                                   (readline not compiled in, extended help enabled)

                                         Copyright (C) 2000-2024 The PARI Group

PARI/GP is free software, covered by the GNU General Public License, and comes WITHOUT ANY WARRANTY WHATSOEVER.

Type ? for help, \q to quit.
Type ?18 for how to get moral (and possibly technical) support.

parisize = 8000000, primelimit = 1048576, factorlimit = 1048576
n=17468130/99999988, nth=1, time: 2min, 34,102 ms
?
===
Все после 3-его варианта с раскомментированной первой строкой.

 
 
 
 Re: кортежи последовательных простых. ключ к 19-252
Сообщение26.08.2025, 16:50 
DemISdx
Спасибо.
Можно считать что 2м24с в один поток и 40с в 28 потоков, отношение всего лишь 2м24с/40с=3.6 вместо 28.

Теперь интересно что будет под "не виндой" (линуксом или чем там можно проверить, wrest обещался к вечеру попробовать в WSL2 (как понимаю это линукс под виндой)).

 
 
 
 Re: кортежи последовательных простых. ключ к 19-252
Сообщение26.08.2025, 17:54 
Dmitriy40 в сообщении #1699719 писал(а):
Теперь интересно что будет под "не виндой"
Смотрим под катом:

(Оффтоп)

Код был немного модифицирован под старую версию pari/gp:
Код:
inline(nth=default(nbthreads)); inline(stop=precprime(10^8)); t0=getwalltime(); n=0;
inline(f(i,n,s)={my(x,y=0,a); forstep(a=i,s-1,n, if(ispseudoprime(lift(chinese(Mod(1,9699690),Mod(a,s)))), y++); ); y});
parfor(th=1,nth, f(th,nth,stop), r,n+=r);
print("n=",n,"/",stop-1,", nth=",nth,", time: ",(getwalltime()-t0)/1000.0,"s");
Смотрим результаты:
Код:
/usr/local/bin/gp-2.9
                                                       GP/PARI CALCULATOR Version 2.9.3 (released)
                                             amd64 running freebsd (x86-64/GMP-6.1.2 kernel) 64-bit version
                        compiled: Jul 31 2022, FreeBSD clang version 5.0.1 (tags/RELEASE_501/final 320880) (based on LLVM 5.0.1)
                                                                threading engine: pthread
                                                     (readline v7.0 enabled, extended help enabled)

                                                         Copyright (C) 2000-2017 The PARI Group

PARI/GP is free software, covered by the GNU General Public License, and comes WITHOUT ANY WARRANTY WHATSOEVER.

Type ? for help, \q to quit.
Type ?15 for how to get moral (and possibly technical) support.

parisize = 8000000, primelimit = 500000, nbthreads = 16
? inline(nth=default(nbthreads)); inline(stop=precprime(10^8)); t0=getwalltime(); n=0;
? inline(f(i,n,s)={my(x,y=0,a); forstep(a=i,s-1,n, if(ispseudoprime(lift(chinese(Mod(1,9699690),Mod(a,s)))), y++); ); y});
? parfor(th=1,nth, f(th,nth,stop), r,n+=r);
? print("n=",n,"/",stop-1,", nth=",nth,", time: ",(getwalltime()-t0)/1000.0,"s");
n=17468130/99999988, nth=16, time: 50.163000000000000000000000000000000000s
?
?
? inline(nth=default(nbthreads)); inline(stop=precprime(10^8)); t0=getwalltime(); n=0;
? inline(f(i,n,s)={my(x,y=0,a); forstep(a=i,s-1,n, if(ispseudoprime(lift(chinese(Mod(1,9699690),Mod(a,s)))), y++); ); y});
? parfor(th=1,nth, f(th,nth,stop), r,n+=r);
? print("n=",n,"/",stop-1,", nth=",nth,", time: ",(getwalltime()-t0)/1000.0,"s");
n=17468130/99999988, nth=16, time: 41.539000000000000000000000000000000000s
?
?
? inline(nth=default(nbthreads)); inline(stop=precprime(10^8)); t0=getwalltime(); n=0;
? inline(f(i,n,s)={my(x,y=0,a); forstep(a=i,s-1,n, if(ispseudoprime(lift(chinese(Mod(1,9699690),Mod(a,s)))), y++); ); y});
? parfor(th=1,nth, f(th,nth,stop), r,n+=r);
? print("n=",n,"/",stop-1,", nth=",nth,", time: ",(getwalltime()-t0)/1000.0,"s");
n=17468130/99999988, nth=16, time: 41.257000000000000000000000000000000000s
?
? default(nbthreads,1);
? inline(nth=default(nbthreads)); inline(stop=precprime(10^8)); t0=getwalltime(); n=0;
? inline(f(i,n,s)={my(x,y=0,a); forstep(a=i,s-1,n, if(ispseudoprime(lift(chinese(Mod(1,9699690),Mod(a,s)))), y++); ); y});
? parfor(th=1,nth, f(th,nth,stop), r,n+=r);
? print("n=",n,"/",stop-1,", nth=",nth,", time: ",(getwalltime()-t0)/1000.0,"s");
n=17468130/99999988, nth=1, time: 425.36600000000000000000000000000000000s
?
? inline(nth=default(nbthreads)); inline(stop=precprime(10^8)); t0=getwalltime(); n=0;
? inline(f(i,n,s)={my(x,y=0,a); forstep(a=i,s-1,n, if(ispseudoprime(lift(chinese(Mod(1,9699690),Mod(a,s)))), y++); ); y});
? parfor(th=1,nth, f(th,nth,stop), r,n+=r);
? print("n=",n,"/",stop-1,", nth=",nth,", time: ",(getwalltime()-t0)/1000.0,"s");
n=17468130/99999988, nth=1, time: 424.12100000000000000000000000000000000s
?
? inline(nth=default(nbthreads)); inline(stop=precprime(10^8)); t0=getwalltime(); n=0;
? inline(f(i,n,s)={my(x,y=0,a); forstep(a=i,s-1,n, if(ispseudoprime(lift(chinese(Mod(1,9699690),Mod(a,s)))), y++); ); y});
? parfor(th=1,nth, f(th,nth,stop), r,n+=r);
? print("n=",n,"/",stop-1,", nth=",nth,", time: ",(getwalltime()-t0)/1000.0,"s");
n=17468130/99999988, nth=1, time: 423.78400000000000000000000000000000000s
?
? default(nbthreads,16);
? inline(nth=default(nbthreads)); inline(stop=precprime(10^8)); t0=getwalltime(); n=0;
? inline(f(i,n,s)={my(x,y=0,a); forstep(a=i,s-1,n, if(ispseudoprime(lift(chinese(Mod(1,9699690),Mod(a,s)))), y++); ); y});
? parfor(th=1,nth, f(th,nth,stop), r,n+=r);
? print("n=",n,"/",stop-1,", nth=",nth,", time: ",(getwalltime()-t0)/1000.0,"s");
n=17468130/99999988, nth=16, time: 39.669000000000000000000000000000000000s
?
Загрузка по тредам (столбец THR) для предпоследнего и последнего тестов:
Код:
last pid: 40624;  load averages:  1.03,  1.13,  1.31                                      up 41+19:02:09  17:31:58
94 processes:  2 running, 92 sleeping
CPU:  6.4% user,  0.0% nice,  0.2% system,  0.0% interrupt, 93.3% idle
Mem: 100M Active, 9000M Inact, 9635M Wired, 1278M Buf, 5160M Free
ARC: 956M Total, 416M MFU, 231M MRU, 1354K Anon, 54M Header, 255M Other
     352M Compressed, 556M Uncompressed, 1.58:1 Ratio
Swap: 74G Total, 74G Free

  PID USERNAME    THR PRI NICE   SIZE    RES STATE   C   TIME    WCPU COMMAND
39898 root          1 103    0 62996K 39964K CPU12  12  48:13  97.76% gp-2.9

last pid: 40809;  load averages:  3.98,  1.67,  1.43                                      up 41+19:07:29  17:37:18
94 processes:  1 running, 93 sleeping
CPU:  100% user,  0.0% nice,  0.0% system,  0.0% interrupt,  0.0% idle
Mem: 162M Active, 9000M Inact, 9636M Wired, 1278M Buf, 5098M Free
ARC: 953M Total, 418M MFU, 222M MRU, 3152K Anon, 54M Header, 255M Other
     347M Compressed, 547M Uncompressed, 1.58:1 Ratio
Swap: 74G Total, 74G Free

  PID USERNAME    THR PRI NICE   SIZE    RES STATE   C   TIME    WCPU COMMAND
39898 root         17  20    0   184M   101M uwait   7  57:02 1606.37% gp-2.9
40264 root          1  20    0  8164K  4256K CPU12  12   0:01   0.09% top
Важно понимать, что этот код исполнялся на старом железе 2012 года, в отличии от теста на винде.
Машина двухпроцессорная, процессоры ксеон, AVX2 в процессорах отсутствует, гипертреадинг включен.
Т.е. 4*2*2 = 16 потоков

 
 
 
 Re: параллелизация в PARI/GP
Сообщение26.08.2025, 18:12 
Ну то есть ускорение с 424с до 40с, в 10.6 раза при 8+8 потоках, очень даже хорошо, гипертрейдинг дело такое, сколько добавит никогда не угадаешь. Но что ускорение даже выше 8 раз - уже очень хорошо.
Значит проблема таки в винде и/или mingw обёртке.

 
 
 
 Re: параллелизация в PARI/GP
Сообщение26.08.2025, 18:49 
И еще тест под катом:

(Оффтоп)

В котором используется однопотоковая версия pari/gp 2.13.4 на том-же железе:
Код:
/usr/local/bin/gp
                                                      GP/PARI CALCULATOR Version 2.13.4 (released)
                                             amd64 running freebsd (x86-64/GMP-6.1.2 kernel) 64-bit version
                                           compiled: Sep 13 2022, gcc version 6.4.0 (FreeBSD Ports Collection)
                                                                threading engine: single
                                                     (readline v7.0 enabled, extended help enabled)

                                                         Copyright (C) 2000-2020 The PARI Group

PARI/GP is free software, covered by the GNU General Public License, and comes WITHOUT ANY WARRANTY WHATSOEVER.

Type ? for help, \q to quit.
Type ?17 for how to get moral (and possibly technical) support.

parisize = 8000000, primelimit = 500000
? inline(nth=default(nbthreads)); inline(stop=precprime(10^8)); t0=getwalltime(); n=0;
? inline(f(i,n,s)={my(x,y=0,a); forstep(a=i,s-1,n, if(ispseudoprime(lift(chinese(Mod(1,9699690),Mod(a,s)))), y++); ); y});
? parfor(th=1,nth, f(th,nth,stop), r,n+=r);

? print("n=",n,"/",stop-1,", nth=",nth,", time: ",(getwalltime()-t0)/1000.0,"s");
n=17468130/99999988, nth=1, time: 239.46100000000000000000000000000000000s
? inline(nth=default(nbthreads)); inline(stop=precprime(10^8)); t0=getwalltime(); n=0;
? inline(f(i,n,s)={my(x,y=0,a); forstep(a=i,s-1,n, if(ispseudoprime(lift(chinese(Mod(1,9699690),Mod(a,s)))), y++); ); y});
? parfor(th=1,nth, f(th,nth,stop), r,n+=r);
? print("n=",n,"/",stop-1,", nth=",nth,", time: ",(getwalltime()-t0)/1000.0,"s");
n=17468130/99999988, nth=1, time: 239.48300000000000000000000000000000000s
?
?
? inline(nth=default(nbthreads)); inline(stop=precprime(10^8)); t0=getwalltime(); n=0;
? inline(f(i,n,s)={my(x,y=0,a); forstep(a=i,s-1,n, if(ispseudoprime(lift(chinese(Mod(1,9699690),Mod(a,s)))), y++); ); y});
? parfor(th=1,nth, f(th,nth,stop), r,n+=r);
? print("n=",n,"/",stop-1,", nth=",nth,", time: ",(getwalltime()-t0)/1000.0,"s");
n=17468130/99999988, nth=1, time: 239.07800000000000000000000000000000000s
?
Также обратите внимание, что компиляторы сборки разные.

 
 
 
 Re: параллелизация в PARI/GP
Сообщение26.08.2025, 21:10 
Dmitriy40 в сообщении #1699697 писал(а):
в двух вариантах, сначала в показанном, потом с раскомментированной первой строкой (чтобы в один поток). У меня вывод такой:

У меня (Win11, WSL2, ubuntu 24.04 LTS, pari 17.2):
n=17468130/99999988, nth=1, time: 2min, 6,944 ms
n=17468130/99999988, nth=2, time: 1min, 11,248 ms
n=17468130/99999988, nth=3, time: 54,765 ms
n=17468130/99999988, nth=4, time: 47,365 ms
n=17468130/99999988, nth=8, time: 36,110 ms


2 потока ускорение 1,8 (2х0,9)
3 потока ускорение 2,3 (3х0,75)
4 потока ускорение 2,7 (4х0,68)
8 потоков ускорение 3,5 (8х0,44)
Ну между 4 и 8 понятно: гипертрейдинг это все-таки не полноценные ядра.
Но и до этого падает коэффициент заметно.
Правда, и венда чем-то же занимается помимо WSL

 
 
 
 Re: параллелизация в PARI/GP
Сообщение26.08.2025, 21:33 
Спасибо.
Т.е. можно сделать вывод что под виндой parfor (а скорее всего и все другие параллельные команды) работает не всегда хорошо (а нередко и очень плохо).
А вот под "не виндой" (линуксом и фрибсд) гораздо лучше, даже когда они запущены под виндой (WSL2).
MinGW виновата или винда или кто-то ещё - мне несущественно, всё равно других готовых вариантов нет.

 
 
 [ Сообщений: 34 ]  На страницу Пред.  1, 2, 3  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group