近年来,出现了几个库/软件项目,它们提供了某种形式的通用数据驱动的共享内存并行性。
主要思想是,程序员不是编写显式线程代码,而是将他们的算法实现为相互依赖的任务,然后由共享内存机器上的通用中间件动态调度。
此类库的示例有:
Cilk:最初是一个基于 MIT 的项目,现在由 Intel 支持,作为 C 语言/编译器扩展实现,用于Cilkchess计算机国际象棋软件,并在 FFTW 中进行实验。
SMP 超标量:在巴塞罗那超级计算中心开发,在许多方面类似于 Cilk,基于
#pragma
扩展。StarPU:基于类似库的“codelet”,可以在包括 GPU 在内的多种不同架构上编译和调度。
OpenMP 任务:从 3.0 版开始,OpenMP 引入了可以异步调度的“任务”(参见规范的第 2.7 节)。
英特尔的线程构建块:使用 C++ 类创建和启动异步任务,请参阅教程的第 11 节。
OpenCL:支持多核上基于任务的并行性。
虽然有很多文献描述了这些库/语言扩展的内部工作以及它们对特定问题的应用,但我只遇到过很少的例子,它们在科学计算应用程序中被实际使用。
那么问题来了:有没有人知道科学计算代码使用这些库/语言扩展中的任何一个,或类似的,用于共享内存并行?