This code works as desired in parallel. Thanks for the instructions.
    
    
    proc column_load(prime, j, k, r: int) {.gcsafe.} =
      {.gcsafe.}:
        for ri in residues:                      # for each prime|residue pair
          let prod = r * ri                      # compute res cross-product
          let row  = posn[prod mod modpg] * pcnt # compute restrack address
          # compute|store for each row the resgroup vals for prime in column j
          nextp[row + j] = uint(k*(prime + ri) + (prod-2) div modpg)
    
    # Initialize the [rescnt x pcnt] 'nextp' table with resgroup values of the
    # 1st prime multiples for each prime r1..sqrt(N) for each PG residue track.
    proc nextp_init() =
      # load 'nextp' with 1st prime multiples regroups vals on each residue 
track
      parallel:                                 # do in parallel
        for j, prime in primes:                 # for each prime r1..sqrt(N)
          let k = (prime-2) div modpg           # find the resgroup it's in
          let r = (prime-2) mod modpg + 2       # and its residue value
          spawn column_load(prime, j, k, r)     # load column resgroups for 
prime
      sync()
    

I guess it was surprising that even when I turned off compiling with garbage 
collection (`--gc:none`) it still applied gc rules to this structure. Well, I 
learned a little bit more about Nim.

Reply via email to