据我所知,C ++ 17将附带Parallelism。但是,我无法理解的是它是一种特定的硬件并行性(默认为CPU)?或者它可以扩展到具有多个计算单元的任何硬件?
换句话说,我们会看到类似的东西,例如" nVidia C ++标准编译器"哪个要编译要在GPU上执行的并行部分?
例如,它是OpenCL的一种更标准化的替代方案吗?
注意:当然,我不要求" nVidia会这样做吗?"。我在问C ++ 17标准是否允许,以及理论上是否可行。
答案 0 :(得分:2)
这个问题提供了与提出这种变化的论文的链接,并且就并行性方面而言,对所提出的内容没有实质性的改变。是的,编译器可以对目标硬件执行任何有意义的操作来并行化各种算法的执行,只要它得到正确的答案(带有一些保留)并且它不会产生不必要的开销(同样,有些保留)
有几点需要了解。
首先,C ++ 17并行性不是一般的并行编程机制。它提供了许多STL算法的并行版本,仅此而已。因此,它不能取代OpenCL,TBB等更强大的机制。
其次,当您尝试并行化算法时存在固有的局限性,这就是我添加这两个括号内资格的原因。例如,std::accumulate
的并行版本将产生与非并行版本相同的结果,仅当应用于输入范围的函数是可交换和关联的时。这里最明显的问题是浮点值,其中数学运算不是关联的,因此结果可能不同。类似地,一些算法在并行化时实际上会产生更多的开销;你得到了一个净加速,但总共完成了更多的工作,因此这些算法的加速比在处理单元的数量上不是线性的。 std::partial_sum
是一个示例:每个输出值都取决于前面的值,因此并行化算法并不简单。有办法做到这一点,但最终应用组合函数的次数比非并行算法多。一般而言,为了反映这一现实,算法的复杂性要求有所放松。