在Chapel中使用forall填充阵列

时间:2017-12-19 17:04:09

标签: sparse-matrix chapel

这在我的笔记本电脑上工作正常,但我想知道这是否会导致大规模问题。假设我想填充一个非常大的数组,但是每个条目都需要在一个大的,稀疏的分布式矩阵上进行强烈的矩阵运算。我是否应该期待以下设计?

var x: [1..N] real;

forall i in [1..N] {
  x[i] = reallyHeavyMatrixComputation(i);
}

是否有保持理智的提示?我应该使用dmapped作为x的域名吗?

1 个答案:

答案 0 :(得分:3)

Chapel的forall-loop可以扩展到多个语言环境,但是否会这样做取决于它们迭代的内容以及循环体。

更详细地说,关键的并行循环策略如"应该使用多少个任务?"和"这些任务应该在哪里运行?"由循环的迭代控制。例如,在以下循环中:

var x: [1..N] real;                        // declare a local array

forall i in 1..N do                        // iterate over its indices in parallel
  x[i] = reallyHeavyMatrixComputation(i);

循环的迭代是范围1..N。默认情况下,范围的迭代器将创建许多本地任务,这些任务等于当前语言环境中的处理器单元/核心数。因此,上面的循环不会变得更快,因为除了reallyHeavyMatrixComputation()本身包含以智能方式在语言环境中分配计算的on子句之外,所以使用了更多的语言环境。如果它根本不包含任何on-clauses,则计算将永远不会离开语言环境#0并且仅为共享内​​存。

相反,如果使用forall循环迭代分布式域或阵列,默认策略通常是在每个目标语言环境上运行许多任务,等于&#34中该语言环境中的处理器核心数。 ;所有者 - 计算"时尚。也就是说,每个语言环境将执行它所拥有的迭代子集,这由分布确定。例如,给定循环:

use CyclicDist;                            // make use of the cyclic distribution module

var D = {1..N} dmapped Cyclic(startIdx=1); // declare a cyclically distributed domain
var x: [D] real;                           // declare an array over that domain

forall i in D do                           // iterate over the domain in parallel
  x[i] = reallyHeavyMatrixComputation();

D的索引将在区域设置中循环分布,因此并行循环将在每个区域设置上创建任务,这些任务将执行区域设置的索引。因此,即使reallyHeavyMatrixComputation()是完全本地计算,此循环也应该跨多个语言环境进行扩展。

在Chapel中编写可伸缩并行循环的另一种方法是调用显式并行迭代器,该迭代器将跨区域设置本身分配工作。例如,Chapel版本1.16添加了一个distributed iterators包模块,该模块提供了将为您分配工作的迭代器。回到第一个例子,如果它被重写为:

use DistributedIters;                  // make use of the distributed iterator module                                                                          

var x: [1..N] real;                    // declare a local array

forall i in distributedDynamic(1..N) do    // distribute iterations across locales
  x[i] = reallyHeavyMatrixComputation(i);

然后调用distributedDynamic迭代器将成为循环的迭代,而不是范围1..N和控制任务创建。此迭代器使用指定的块大小(默认为1)动态地将迭代交付到语言环境,因此可用于以可伸缩的方式使用多个语言环境。有关详细信息,请参阅its documentation