| Ruud H.G. van Tol on Tue, 10 Feb 2026 10:26:22 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: Is short-circuit evaluation possible with parfor() ? |
On 2026-02-10 08:58, hermann@stamm-wilbrandt.de wrote:
Thanks, but break did not help: hermann@x3950-X6:~$ gp -q? isok2(n)={s=0;p=prime(n+1)#;export(s,p);parfor(i=2,n+1,ispseudoprime(1+p/prime(i)),r,if(r,s=1;break));s==0};? isok2(1994) 0 ? ## *** last result: cpu time 1h, 21min, 39,829 ms, real time 26,349 ms. ? isok2(1993) 1 ? ## *** last result: cpu time 1h, 24min, 46,507 ms, real time 28,423 ms. ?So I looked in the doc and there it states that return should abort, but I cannot measure that:? isok2(n)={p=prime(n+1)#;export(p);parfor(i=2,n+1,ispseudoprime(1+p/prime(i)),r,if(r,return(0)));1};? isok2(1994) 0 ? ## *** last result: cpu time 1h, 21min, 49,788 ms, real time 27,072 ms. ? I do the same if(r,return(...)) as in the doc, what am I missing?
Hello Hermann,
I expect it to be related to your nbthreads setting.
Mine is at 10. I hardly ever go over 12, to avoid overhead.
Even with many (virtual) CPUs, a lower setting might work out better,
as then it will have initiated less superfluous threads.
Would be easy to try and test and count.
? isok2(500)
cpu time = 14,893 ms, real time = 1,577 ms.
%15 = 0
? isok3(500)
cpu time = 6,802 ms, real time = 717 ms.
%16 = 0
isok4(n)= { \\ same performance as isok3
my(p=prime(n+1)#); \\ or: vecprod(primes(n+1))
parfor(i=2,n+1
, ispseudoprime(1+p/prime(i)), r, r && return(0)
);
1;
}
I don't call export(), as I think that for this case it is superfluous.
-- Ruud