4

我最近遇到了教堂,我很想尝试一下。我有两个问题,我希望它能解决。

我通常使用 Python 或 C++ 工作。Java 陷入困境时。

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

首先,使用 SciPy,我现在可以将两者都从 SQL 数据库加载到内存中。但是,我预计我们的下一次迭代对于我们的机器来说太大了。也许1.5M ^ 2。在这种情况下,来自 Spark 的 RDD 可能会为负载工作。我无法让 PyTables 实现这一点。我知道这被描述为“核外”问题。

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

一个严重的限制是机器的预算。例如,我买不起克雷。礼拜堂社区有这方面的模式吗?

4

1 回答 1

3

从几个高层次的观点开始:

  • 从本质上讲,Chapel 语言更多的是关于数组(数据结构)而不是矩阵(数学对象),尽管显然可以使用数组来表示矩阵。将区别视为一组受支持的操作(例如,数组的迭代、访问和元素操作与矩阵的转置、叉积和因式分解)。
  • 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 程序需要将其配置为使用多个语言环境。除了 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 中,分布式稀疏数组支持仍处于起步阶段,因为迄今为止该项目对分布式内存的大部分关注都集中在任务并行性和分布式密集数组上。在今年的年度 Chapel 研讨会上,来自伯克利的一篇论文+演讲“Towards a GraphBLAS Library in Chapel”强调了几个性能和可​​扩展性问题,其中一些已经在 master 分支上修复,其他一些仍然需要关注。用户对此类功能的反馈和兴趣是加速这些领域改进的最佳方式。

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

  • Chapel 还没有 SQL 接口,尽管一些社区成员抱怨要添加这样的支持。也可以使用 Chapel 的 I/O 功能以某种文本或二进制格式读取数据。或者,您可以潜在地使用 Chapel 的互操作性功能与可以读取 SQL 的 C 库进行交互。

于 2017-07-18T19:22:10.440 回答