我正在努力解决我被分配的递归加倍问题。我知道递归加倍将更大的问题分解为更小的子问题,以便计算可以并行化,但我不认为它可以用这个问题。
练习1.4。操作
(i){
x [i + 1] = a [i] * x [i] + b [i];
}无法由管道处理,因为它之间存在依赖关系 输入一次迭代的操作和输出 以前。但是,您可以将循环转换为循环 在数学上等效,并且可能更有效地计算。 派生一个表达式,从x [i]计算x [i + 2]而不涉及 X [I + 1]。这被称为递归加倍。假设你有很多 临时存储。您现在可以通过
执行计算•做一些初步计算;
•计算x [i],x [i + 2],x [i + 4],......,并从中,
•计算缺失的术语x [i + 1],x [i + 3],....
通过给出T0(n)和的公式来分析该方案的效率 TS(N)。你能想出一个为何进行初步计算的论据 在某些情况下可能不太重要?
所以我理解x2的表达式是:x2 = a1(a0 * x0 + b0)+ b1 但我不明白的是A.这是如何与递归双重...以及B.如果仍然需要先前计算的结果,这将如何实现任何加速。
答案 0 :(得分:1)
中心概念是,一旦你能用x [i],a [i]和b [i]计算x [i + 2],你就可以分成两个线程:
事实上,如果您对并行化开销有很好的了解,就可以生成一个Fibonacci进程树,每当前一个线程运行得很好时就开始一个新的进程。