从几个高层次的观点开始:
- 从本质上讲,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 的一项正在进行中的工作。过去的版本为BLAS和LAPACK添加了 Chapel 模块。Chapel 1.15 包括一个更高级别的线性代数库的开始。但是目前这些都不支持分布式数组(BLAS 和 LAPACK 的设计,LinearAlgebra 因为它还处于早期阶段)。
Chapel 还没有 SQL 接口,尽管一些社区成员抱怨要添加这样的支持。也可以使用 Chapel 的 I/O 功能以某种文本或二进制格式读取数据。或者,您可以潜在地使用 Chapel 的互操作性功能与可以读取 SQL 的 C 库进行交互。