设一个数列S[N], 其中S[0] = 0; S[k] = S[k - 1] + k ( 1 <= k < N).
对于这个问题的求解串行算法相当简单,O(N)时间复杂度,不再解释。
并行:
假设有 M 个线程, 其中 M << N;
S[K] = S[K - 1] + K
= S[K - 2] + K - 1 + K
= S[K - 3] + K - 2 + K - 1 + k
...
= S[K - M] + M * K - M * (M - 1)/ 2
假设 M = 2
则S[K] = S[K - 2] + 2 * K - 1, 所以
S[0] , S[2] , S[4] .... S[2 * T] 和 S[1] , S[3] , S[5] .... S[2 * T + 1]为两个独立的序列,因此可以使用两个线程进行并行计算。
同理,M 为其它值时也一样, 如此就实现的并行计算的算法。