由于以下原因[2],编译器或工具的自动并行化非常困难:
使用间接寻址、指针、递归和间接函数调用的代码很难进行依赖性分析;
循环的迭代次数未知;
对全局资源的访问在内存分配、I/O 和共享变量方面很难协调。
如您所见,第一点的问题主要与编程语言有关。在 C/C++ 中,您会遇到第 1 点中提到的所有问题。所以我的问题是,我们是否有一种接近 C/C++ 但没有这些问题的语言。我知道 Fortran 可以满足要求,但它甚至不像 C/C++。
由于以下原因[2],编译器或工具的自动并行化非常困难:
使用间接寻址、指针、递归和间接函数调用的代码很难进行依赖性分析;
循环的迭代次数未知;
对全局资源的访问在内存分配、I/O 和共享变量方面很难协调。
如您所见,第一点的问题主要与编程语言有关。在 C/C++ 中,您会遇到第 1 点中提到的所有问题。所以我的问题是,我们是否有一种接近 C/C++ 但没有这些问题的语言。我知道 Fortran 可以满足要求,但它甚至不像 C/C++。
有几个标准介绍了 C 和 C++ 中的并行化语法。一个例子是Unified Parallel C,另一个是openCL,两者的用途截然不同。
可能最符合您要求的是OpenMP。它扩展了 C 和 C++ 语言,因此您可以告诉编译器并行化您的代码(以及在哪里执行)。
函数式编程语言(例如 Lisp、Haskell 和 F#)本质上是高度可自动并行化的,但也与 C 和 C++ 等过程和 OOP 语言有很大不同
FORTRAN 有一些独特的功能(可能最好描述为缺乏功能),这些功能允许干净、自动的并行化;然而,随着最近对 FORTRAN 的所有添加,尚不清楚该语言的现代等价物是否保持这种区别。
就逻辑结构而言,与 C 和 C++ 相比,FORTRAN 并没有走得太远。然而,为了处理复杂的数据结构,FORTRAN 的根倾向于跨多个关联数组存储结构,然后使用特定字段作为“下一个”索引。这避免了指针,但提供了类似的灵活性。
当我更多地使用该语言时,我已经看到了哈希表、树和其他结构的 FORTRAN 实现;但是,它肯定不是为了简单地表示这样而编写的,而且我想这样的代码很难并行化。