我有这段代码:
for(i=0; i<size; i++)
{
d[i] = d[i-1] + v[i];
}
当我对这个循环进行并行处理时,我有数据依赖性,启动间隔变为2 我的意思是:
启动间隔:2
|load v[i-1]|load d[i-2]| add |store d[i-1]|
| | | load v[i]|load d[i-1] | add | store d[i] |
我不想在两者之间拖延。
启动间隔:1
|load v[i-1]|load d[i-2]| add |store d[i-1]|
| |load v[i] |load d[i-1]| add | store d[i] |
这是不可能的,因为还没有存储d [i-1]。
如何通过更改代码将启动间隔设为1?
答案 0 :(得分:1)
你无法缩小差距。
这种(循环展开)对于这种循环来说并不是最有效的并行处理方式。你的循环看起来像前缀和操作。有快速并行算法和实现可用于前缀和。例如,this question