自动并行化
问题内容:
您对将尝试获取代码并将其自动拆分为线程的项目有何看法(可能是编译时,可能是在运行时)。
看下面的代码:
for(int i=0;i<100;i++)
sum1 += rand(100)
for(int j=0;j<100;j++)
sum2 += rand(100)/2
这种代码可以自动拆分为两个并行运行的线程。您是否认为有可能?从理论上讲,我感觉这是不可能的(这使我想起了停顿的问题),但是我不能证明这种想法是正确的。
您认为这是一个有用的项目吗?有没有类似的东西?
问题答案:
在一般情况下是否可以知道一段代码是否可以并行化并不重要,因为即使您的算法无法检测到所有可以并行化的情况,也可能可以检测到其中的一些情况。
这并不意味着它将有用。考虑以下:
- 首先,要在编译时执行此操作,必须检查您可能要并行化的构造内部可能到达的所有代码路径。除了简单的计算之外,这对于任何其他事情可能都是棘手的。
- 其次,您必须以某种方式决定什么是可并行化的,什么不是并行化的。例如,您不能轻易破坏将同一状态修改为多个线程的循环。这可能是一项非常艰巨的任务,并且在许多情况下,您最终可能不确定-两个变量实际上可能引用同一个对象。
- 即使您可以实现此目标,也最终会使用户感到困惑。很难解释为什么他的代码不可并行化以及应如何更改。
我认为,如果要使用Java实现此功能,则需要将其更多地编写为库,并让用户决定要并行化的内容(库功能和注释?大声思考)。功能语言更适合于此。
琐事:在并行编程过程中,我们必须检查代码并确定代码是否可并行化。我不记得具体细节(有关“至多一次”资产?有人来填补我的心吗?),但是故事的寓意是,即使是看似琐碎的案件,这也极其困难。