对中间数据进行划分
在很多的算法中,输出集中的数据之间的存在复杂的依赖关系,这种情况下,对输出集按照元素进行划分不再可行。对有的算法来说,它们的计算可以被重新组织为下面的多级计算:
其中每级的输出数据之间没有依赖关系(它们对应的计算可以并行进行)。此时可以对中间数据(每级的输出)进行数据划分。
比如下面的计算前序和的算法:
PrefixSum(A, n, S)
{
for (j=0; j<n; j++)
S[j] = A[j];
for (i=1; i<n; i*=2) {
for (j=n-1; j>=i; j--)
S[j] += S[j-i];
}
}
对长度为n的序列A计算前序和,结果存储在S中,计算的过程可以分为i=个步骤,在每个步骤中,有。
对一个16个元素的序列上的计算过程如下图:
它的计算在四个循环(步骤)后结束。对这四个步骤的输出可以进行数据划分,它们是对应的计算任务是可以并行执行的。
|