电子表格通常是声明性的一阶功能程序,用作组织工具,用于最终用户开发和教育目的。电子表格最终用户通常是使用电子表格作为主要计算模型的领域专家,但他们很少是受过培训的 IT 专业人员,他们可以利用当今丰富的多核处理器进行电子表格计算。

在文中,我们提出了一种针对共享内存多核架构的电子表格的自动并行评估算法,该算法允许最终用户透明地使用其多核处理器。我们在一组合成和真实世界的电子表格上评估我们的算法,并在 16 个内核上获得高达 48 倍的加速。

电子表格中的单元格包含常量(例如数字)、字符串或错误(例如 #NA 或 #DIV/0!
)或公式表达式(由前导等号字符指示),例如 =1+2。每个单元格由其列和行表示,其中列从 A 开始,行从 1 开始。
公式可以通过命名其他单元格的列和行地址来引用其他单元格;这将在单元格之间建立依赖关系。例如,B3 引用第二列和第三行中的单元格。公式 =A1+B1 是指两个单元格,其值取决于这些单元格的内容。公式也可以使用 : 运算符引用其两个相对的角来引用矩形单元格区域,或调用函数。例如,计算 A 列前十行中所有值的总和可以表示为 =SUM(A1:A10)。
电子表格还支持图和依赖关系图,电子表格的依赖关系图捕获单元格依赖关系,而其反向支持图捕获单元格支持。支持图类似于数据流图,其中节点是单元,数据沿边缘从前一个单元流向依赖单元。单元格B3包含公式= A1 + B1,这意味着B3依赖于A1和B1,并且A1和B1支持B3。
某些函数(如 ROW 和 INDIRECT)可以在 Excel 和 LibreOffice Calc 中找到,它们可以通过将参数字符串解释为单元格引用来动态引用其他单元格。即使它们的依赖关系不是静态给出的,它们也可能导致动态循环。
例如,若要计算公式 =INDIRECT(“B”&A1),字符串“B”和单元格 A1 的内容与字符串连接运算符 &。生成的字符串被解释为单元格引用,该引用将引用 B 列中的某个单元格,但确切的单元格将取决于单元格 A1 的内容。
针对电子表格的重新计算,有两种类型的重新计算。完全重新计算无条件地重新计算所有公式单元格。最小重新计算仅通过支持图重新评估用户修改的单元格和所有挥发性单元格的传递闭合。
我们将开始最小重新计算的单元格称为重新计算根。如果用户将 B1 中的公式从 =A123 更改为 =A1+A3,则 B1 是重新计算根,必须更新 B1 和 B3 以反映更改。
如上所述,某些单元格被标记为易失性,因为它们包含对易失性函数的调用,例如图中的 NOW 和 RAND 函数。并且无论用户是否修改了单元格,都会自动重新评估。该函数 NOW 返回当前时间,如果未重新计算,则包含过时值。
同样,如果在每次重新计算时未重新计算调用 RAND 的单元,则它只会生成一个随机数,并且对单元格 B1 中的 IF 的调用将卡在一个分支上,直到再次评估该单元。
重新计算的目的是使电子表格处于一致状态。假设 \(\phi\) 是从单元格到公式表达式的映射,\(\sigma\) 是从单元格到其值的映射。前者对电子表格中单元格之间的基础计算和依赖关系进行建模,而后者则对特定重新计算的结果进行建模。非公式单元格(即常量)不在 \(\phi\) 的域中。
真实世界的电子表格LibreOffice Calc提供了一组大型基准电子表格。对大型所谓的“现实世界”电子表格进行基准测试旨在让我们深入了解Puncalc 如何应对结构逼真的电子表格。为了能够在 Puncalc 中运行电子表格,我们删除了所有方便的宏,并将不支持的函数实现为 SDF。
此外,我们检测所有没有公式依赖项的公式单元格,并将它们用作重新计算根以模拟最小的重新计算。因此,它们最初在全局工作队列中排队,然后主线程可以将单元格从队列中取消排队,而与排队线程的干扰很小。
但是,这可能会对性能产生积极影响,并且是不现实的,因为用户通常一次只编辑一个单元格。
Puncalc是一个针对共享内存多处理器的电子表格引擎,并自动从电子表格计算中提取并行性,在不增加任何工程开销的情况下获得总体上令人满意的加速。
我们已经对Sect中的性能结果给出了一些可能的解释。但需要进一步调查。此外,我们缺乏将Puncalc的性能与其他电子表格并行化框架的性能)的性能进行直接比较。
我们相信,我们的工作与工作表定义函数的工作相结合是迈向最终用户开发强大框架的第一步,并希望为范式转变铺平道路,在范式转变中,电子表格被研究人员和IT专业人员视为解决广泛问题的严肃计算工具。