说我需要计算一个大数组A [n]的平方和,其中n可以是数百万,我有N个线程可以使用。有人能指出我做一个很好的并行算法吗?谢谢!
答案 0 :(得分:1)
这是一个算法: -
1. divide numbers in n/N blocks
2. Compute for one block squares in parallel in O(1)
3. addition can be done in O(log(N)) for 1 block using adding pair at time
时间复杂度: - 的 O(日志(N)*(N / N))强>
注意:这个时间复杂度完全是理论上的,你需要在并行操作结束后等待线程同步,这会增加延迟。
编辑: -
以下伪代码可能会为线程解释O(logN)
并行算法: -
void add(i,N) {
int k = 1;
while(i+k<N && i%k==0 && (i/k)%2==0) {
arr[i] = arr[i]+arr[i+k];
synchronize();
k = 2*k;
}
}
注意: - 这是用于处理N大小块的ith
索引的线程号i的代码,请注意该循环是 O(logN) as k每次迭代增加2倍, synchronize()函数用于等待其他线程完成迭代,如果它们不同步。尝试解决这个问题,你会得到一个想法,最后的补充答案将在arr[0]