基于C++模板和骨架的通用并行编程
1. 溢出向量计算与整体结果获取
溢出向量 $o$ 通过对 $spg’$ 应用 $scanr$ 骨架来计算:
$o = scanr(add\ op)\ spg’$
为了获得整体结果,将上式代入:
$CL - add(a, b) = zip(add)(a, zip(add)(b, o))$
其中:
$o = scanr(add\ op)(snoc(zip(get\ spg)(a, b), S))$
通过等式推理得到的骨架公式具有重要优势,由于 $add\ op$ 是可结合的,所有骨架($zip$ 和 $scanr$)都可并行化。
2. 从骨架到C++模板和STL
2.1 骨架与模板
骨架是通用的高阶函数,其参数函数的类型取决于数据结构的数据类型。在C++中,可使用模板机制实现骨架,复杂的函数参数可使用仿函数(实现了函数调用运算符 $operator()$ 的类)来实现。骨架通常不依赖于容器的具体表示,可应用于提供特定接口的任何数据结构。
STL采用迭代器的方法。STL迭代器指向容器的元素,并提供访问元素和在容器内移动迭代器的操作。迭代器支持的具体操作取决于底层数据结构,只有能高效实现的操作才会提供。STL迭代器相应地进行分类,例如双向链表提供双向迭代器,而向量迭代器属于随机访问迭代器类别。通常,STL算法操作由指向序列开始和结束的迭代器对描述的元素序列。实际上,STL提供了许多从函数式编程中已知的骨架,包括归约($accumulate$)、扫描($partial\ sum$)、映射和 $zip$($transform$ 的变体)。然而,大多