我最近遇到了Chapel,我非常渴望尝试一下。我有一个双重问题,我希望它可以解决。
我通常使用Python或C ++。支持Java时的Java。
我有两个矩阵I
和V
。两者都稀疏,尺寸约为600K x 600K,密度约为1%。
首先,使用SciPy,我现在可以从SQL数据库加载到内存中。但是,我希望我们的下一次迭代对我们的机器来说太大了。也许1.5M ^ 2。在这种情况下,Spark的RDD可能适用于负载。我无法让PyTables实现这一目标。我理解这被描述为“核心外”问题。
即使它们确实被加载,只需几分钟就能完成I'IV
。 (这里I'
是转置),所以我正在考虑将这个乘法分布在多个核心(SciPy可以做到)和多台机器上(据我所知,它不能)。在这里,Spark倒下了,但Chapel似乎回答了我的祈祷,可以这么说。
严重的限制是机器上的预算。例如,我买不起Cray。 Chapel社区是否有这种模式?
答案 0 :(得分:3)
从几个高级别开始:
更详细:
以下程序创建一个块分布式密集阵列:
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的一项正在进行的工作。过去的版本添加了BLAS和LAPACK的Chapel模块。 Chapel 1.15包含了一个更高级LinearAlgebra库的开头。但目前这些都不支持分布式阵列(BLAS和LAPACK设计,LinearAlgebra因为它还处于早期阶段)。
Chapel没有SQL接口(尽管如此),尽管一些社区成员已经对添加此类支持做了大肆宣传。也可以使用Chapel的I / O功能以某种文本或二进制格式读取数据。或者,您可以使用Chapel的互操作性功能与可以读取SQL的C库进行交互。