使用Chapel处理大量矩阵

时间:2017-07-18 16:40:04

标签: python scipy distributed-computing chapel

我最近遇到了Chapel,我非常渴望尝试一下。我有一个双重问题,我希望它可以解决。

我通常使用Python或C ++。支持Java时的Java。

我有两个矩阵IV。两者都稀疏,尺寸约为600K x 600K,密度约为1%。

首先,使用SciPy,我现在可以从SQL数据库加载到内存中。但是,我希望我们的下一次迭代对我们的机器来说太大了。也许1.5M ^ 2。在这种情况下,Spark的RDD可能适用于负载。我无法让PyTables实现这一目标。我理解这被描述为“核心外”问题。

即使它们确实被加载,只需几分钟就能完成I'IV。 (这里I'是转置),所以我正在考虑将这个乘法分布在多个核心(SciPy可以做到)和多台机器上(据我所知,它不能)。在这里,Spark倒下了,但Chapel似乎回答了我的祈祷,可以这么说。

严重的限制是机器上的预算。例如,我买不起Cray。 Chapel社区是否有这种模式?

1 个答案:

答案 0 :(得分:3)

从几个高级别开始:

  • 其核心是,Chapel语言更多的是关于数组(数据结构)而不是 关于矩阵(数学对象),虽然显然可以使用数组 表示矩阵。将这种区别视为受支持的集合 操作(例如,阵列的迭代,访问和基本操作 转置,交叉产品和矩阵因子。)
  • Chapel支持稀疏和关联数组以及密集数组。
  • 教堂阵列可以本地存储在单个内存中,也可以分布在各个内存中 多个记忆/计算节点。
  • 在教堂里,你应该期待 通过库支持的矩阵/线性代数运算 而不是语言。虽然Chapel有这样的开端 图书馆,它们仍在扩展 - 具体来说,Chapel没有分布式的库支持 Chapel 1.15中的线性代数运算意味着用户会有 手动编写此类操作。

更详细:

以下程序创建一个块分布式密集阵列:

use BlockDist;
config const n = 10;

const D = {1..n, 1..n} dmapped Block({1..n, 1..n});  // distributed dense index set
var A: [D] real;                                     // distributed dense array

// assign the array elements in parallel based on the owning locale's (compute node's) ID 
forall a in A do
  a = here.id;

// print out the array
writeln(A);

例如,在6个节点(./myProgram -nl 6)上运行时,输出为:

0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0
0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0
0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0
0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0
2.0 2.0 2.0 2.0 2.0 3.0 3.0 3.0 3.0 3.0
2.0 2.0 2.0 2.0 2.0 3.0 3.0 3.0 3.0 3.0
2.0 2.0 2.0 2.0 2.0 3.0 3.0 3.0 3.0 3.0
4.0 4.0 4.0 4.0 4.0 5.0 5.0 5.0 5.0 5.0
4.0 4.0 4.0 4.0 4.0 5.0 5.0 5.0 5.0 5.0
4.0 4.0 4.0 4.0 4.0 5.0 5.0 5.0 5.0 5.0

请注意,在多个节点上运行Chapel程序需要将其配置为使用multiple locales。除了Crays之外,这些程序可以在集群或联网工作站上运行。

这是一个声明分布式稀疏数组的程序:

use BlockDist;

config const n = 10;

const D = {1..n, 1..n} dmapped Block({1..n, 1..n});  // distributed dense index set
var SD: sparse subdomain(D);                         // distributed sparse subset
var A: [SD] real;                                    // distributed sparse array

// populate the sparse index set
SD += (1,1);
SD += (n/2, n/4);
SD += (3*n/4, 3*n/4);
SD += (n, n);

// assign the sparse array elements in parallel
forall a in A do
  a = here.id + 1;

// print a dense view of the array
for i in 1..n {
  for j in 1..n do
    write(A[i,j], " ");
  writeln();
}

在六个区域设置上运行:

1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
0.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 

在上面的两个示例中,forall循环将使用所有者计算方式的多个节点计算分布式数组/索引,并使用每个节点的多个核来执行本地工作。

现在提出一些警告:

  • 从Chapel 1.15.0开始,分布式稀疏数组支持仍处于起步阶段,因为迄今为止,大多数项目都专注于分布式内存,而且是在任务并行和分布式密集阵列上。今年伯克利的一篇论文+谈话annual Chapel workshop,"走向教堂的GraphBLAS图书馆"突出了几个性能和可​​伸缩性问题,其中一些问题已经在主分支上修复,其他问题仍然需要引起注意。用户对此类功能的反馈和兴趣是加速这些领域改进的最佳方式。

  • 正如开头所提到的,线性代数库是Chapel的一项正在进行的工作。过去的版本添加了BLASLAPACK的Chapel模块。 Chapel 1.15包含了一个更高级LinearAlgebra库的开头。但目前这些都不支持分布式阵列(BLAS和LAPACK设计,LinearAlgebra因为它还处于早期阶段)。

  • Chapel没有SQL接口(尽管如此),尽管一些社区成员已经对添加此类支持做了大肆宣传。也可以使用Chapel的I / O功能以某种文本或二进制格式读取数据。或者,您可以使用Chapel的互操作性功能与可以读取SQL的C库进行交互。