-mt N slowdown as N increases
quer invokes a Lehmer RNG. Oddly enough, it runs slower with more threads.
sac2c crud.sac -O3
apex@medusa:/tmp/crud$ time a.out;
before quer
after quer
1642668640
real 0m0.245s
user 0m0.233s
sys 0m0.012s
apex@medusa:/tmp/crud$ sac2c crud.sac -O3 -target mt_pth
apex@medusa:/tmp/crud$ time a.out -mt 1
before quer
after quer
1642668640
real 0m0.325s
user 0m0.313s
sys 0m0.012s
apex@medusa:/tmp/crud$ time a.out -mt 2
before quer
after quer
1642668640
real 0m6.456s
user 0m12.890s
sys 0m0.016s
apex@medusa:/tmp/crud$ time a.out -mt 3
before quer
after quer
1642668640
real 0m7.410s
user 0m22.197s
sys 0m0.020s
apex@medusa:/tmp/crud$ time a.out -mt 4
before quer
after quer
1642668640
real 0m9.427s
user 0m37.685s
sys 0m0.008s
Here is the code:
cat crud.sac
// Compiled by APEX Version: FIXME!! 2023-07-17 17:10:54.312
use Array: all;
use StdIO: all;
use Numerical: all;
use String: {tochar};
inline int, int querXII(int y, int QUADio, int[*] QUADrl)
{ // Monadic query (roll) - scalar
inty = toi(y);
if (inty <= 0) print(tochar("roll domain error"));
Q = firstel(QUADrl);
Qrl = Lehmer(Q);
z = (tod(Qrl) * tod(inty)) / tod(2147483647);
return(toi(z) + QUADio, Qrl);
}
inline double sacmod(double x, double y)
{ // SAC _aplmod_ for doubles
if ( 0.0 == y) {
t = 1.0;
} else {
t = y;
}
t2 = floor(x/t);
z = x - (y*t2);
return(z);
}
inline int[.], int querIII(int x, int y, int QUADio, int[*] QUADrl)
{ // Dyadic query (deal) - scalar
// This allocates an array of shape y. If this
// causes you memory grief, use the algorithm in workspace 42 query,
// or use smaller y!
intx = toi(x);
inty = toi(y);
shpz = toi(x);
z = iota (inty);
for( i=0; i<intx; i++) {
// Interchange z[i] with z[i + ? y - i]
rand, QUADrl = querXII(inty -i, 0, QUADrl);
c = i + rand;
if ( c < shpz) {
tmp = z[[c]];
z[[c]] = z[[i]];
z[[i]] = tmp;
}
}
z = take([intx], z);
return(z + QUADio, QUADrl);
}
inline int Lehmer(int qrl)
{ // Lehmer's random number generator
// CACM 1966-06, p. 432
val = tod(qrl)*16807.0;
z = toi(sacmod(val, 2147483647.0));
return(z);
}
inline int firstel( int[*] arg)
{ // First element of any array
zxrho = prod(shape(arg));
ravely = reshape([zxrho], arg);
z = take([1], ravely);
return(z[0]);
}
int main()
{
n_0=( 5000000);
QUADrl_0 = [16807, 0];
show("before quer");
A_48,QUADrl_1=querIII(n_0,n_0,0,QUADrl_0);
show("after quer");
show(sum(A_48));
return(0);
}
Thunderstorm is here, so I am powering down...