Using Nim 0.17.
Afer reading the Nim manual on Parallel programming, and how to use **spawn**
and **parallel** I can't get the following code to compile.
proc residue_sieve(r: int, Kn: int) =
let row = r * pcnt # set address to ith row in next[]
let seg_rti: int = r * KB # start of seg mem for this restrack
for j, prime in primes: # for each prime <= sqrt(N) for
restrack
if next[row+j] < uint(Kn): # if 1st mult resgroup index <= seg
size
var k: int = int(next[row+j]) # get its resgroup value
while k < Kn: # for each primenth byte < segment size
seg[seg_rti + k] += 1'u8 # set ith residue in segment as
nonprime
k += prime # compute next prime multiple resgroup
next[row+j] = uint(k - Kn) # 1st resgroup in next eligible segment
else: next[row+j] -= uint(Kn) # if 1st mult resgroup index > seg size
proc segsieve(Kn: int) = # for Kn resgroups in segment
for b in 0 .. <B: # for every byte in the segment
seg[b] = 0 # set every byte bit to prime (0)
for r in 0 .. <rescnt: # for each ith (of 8) residues for P5
spawn residue_sieve(r, Kn) # perform sieve for each separate
restrack
sync()
I use **import threadpool** and compile with the **\--threads:on** directive,
but get this error.
[jzakiya@jabari-pc nim]$ nim c --cc:clang --d:release --threads:on
ssozp5x.nim
Hint: used config file '/etc/nim.cfg' [Conf]
Hint: system [Processing]
Hint: ssozp5x [Processing]
Hint: math [Processing]
Hint: strutils [Processing]
Hint: parseutils [Processing]
Hint: algorithm [Processing]
Hint: typetraits [Processing]
Hint: threadpool [Processing]
Hint: cpuinfo [Processing]
Hint: os [Processing]
Hint: times [Processing]
Hint: posix [Processing]
Hint: ospaths [Processing]
Hint: linux [Processing]
Hint: cpuload [Processing]
ssozp5x.nim(127, 24) Error: 'spawn' takes a GC safe call expression
[jzakiya@jabari-pc nim]$
After readind the docs, I don't know what a GC (garbage collected) safe call
expression is, or how to make one meet it. Can someone explain how to get this
code to compile?