Parallel processing 如何使用Chapel中的原子变量设置数组大小?

Parallel processing 如何使用Chapel中的原子变量设置数组大小?,parallel-processing,chapel,Parallel Processing,Chapel,在执行过程中,我需要设置多个全局和局部参数。全局参数需要具有共享大小。我想这意味着变量,但这对我来说还是个新概念 var n: atomic int, x: [1..n] real; # a vector of global size proc localDude(){ n +=1; # increase the size of n } 我知道数组将随着域的增长和收缩,但我很难将语义整合在一起。谢谢 所以有几件事 域通过值而不是引用来获取其边界。因此,修改域用来构造其边界的变

在执行过程中,我需要设置多个全局和局部参数。全局参数需要具有共享大小。我想这意味着变量,但这对我来说还是个新概念

var n: atomic int,
    x: [1..n] real;  # a vector of global size

proc localDude(){
  n +=1;  # increase the size of n
}

我知道数组将随着
域的增长和收缩
,但我很难将语义整合在一起。谢谢

所以有几件事

  • 域通过值而不是引用来获取其边界。因此,修改域用来构造其边界的变量不会修改域()
  • 数组确实通过引用获取其域,因此分配给所使用的域变量会使数组发生更改()
  • 域还不是受支持的原子类型,因此拥有全局原子域将不起作用。但是,您可以使用作为锁,以便对修改进行序列化。在底部附近的屏幕上有一个例子(搜索互斥)

  • 恕我直言,您确定并行操作的“原子性”正是您的代码设计策略所依赖的特性吗?操作的(平台)强制原子性的概念通常用于其他一些目的,因此上面概述的想法引起了这些关注。最好是在“破坏性”操作上,比如在许多并行的
    n.{add | sub | fetchAdd | fetchSub | write | exchange |··········································。第二个现场示例中介绍的重新分配技巧,为了注入/进一步促进参考变更,可能会稍微强调一点,以便直接吸引善良读者的注意力,不是吗?解决这一问题中关于
    原子的部分
    原子int
    可以通过使用
    .read()
    方法访问其值来定义数组大小,就像普通的
    int
    一样。因此,您可能想要
    x:[1..n.read()]real
    但是@MemorableUserName这里的要点仍然是正确的,更改原子不会更改域,除非您重新分配它。