Nim:具有变异状态的并行循环

我是Nim语言的新手。 我想通过实现一个简单的遗传算法来演变字符串(整数atm),通过将工作分配给CPU核心来学习:

https://github.com/peheje/nim_genetic

我已经成功地并行化了“代理”的创建,但是却无法调用必须改变传入状态的函数“生命”:

... type Agent* = ref object data*: seq[int] fitness*: float ... var pool: seq[Agent] = newAgentsParallel(POPULATION_SIZE) # Run generations for gen in 0..<N_GENERATIONS: let wheel = createWheel(pool) let partitions: seq[seq[Agent]] = partition(pool, N_THREADS) parallel: for part in partitions: echo "spawning" spawn life(part, pool, wheel) pool = createPool(pool, wheel) ... proc life(part: seq[Agent], pool: seq[Agent], wheel: seq[float]) = for a in part: if random(1.0) < CROSSOVER_PROP: a.crossover(pool, wheel) if random(1.0) < MUTATE_PROP: a.mutate() a.calcFitness() echo "life done" 

CPU被绑定在100%,好像Nim正在将数据复制到“生命”,因为“产卵”之后的RAM使用率高涨。 在Nim手册中提到了平行块:

“在产生的proc(spawn f(loc))中使用的每个其他复杂的位置loc在平行部分的持续时间内必须是不可变的,这称为不变性检查,目前没有指定什么”复杂的位置“意思是说,我们需要把这做成一个优化!“

我非常使用它作为可变状态,所以也许这就是为什么Nim正在复制数据? 我怎样才能绕过传递指针? 几点:

  • 我想我可以避免变异,而是返回被修改的新实例,但我仍然需要通过池和轮阅读
  • 如果并行:语句不可能使用,我将如何使用线程来实现它?
  • 是随机的()线程安全吗? 能怎样?
  • 还有什么我可以做的不同? 比如更容易解开FlowVar?

来自Kotlin与Java8 Streams,我觉得真的被宠坏了。

Interesting Posts