摆脱数据依赖

时间:2013-04-18 00:02:21

标签: parallel-processing

我有这段代码:

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?

1 个答案:

答案 0 :(得分:1)

你无法缩小差距。

这种(循环展开)对于这种循环来说并不是最有效的并行处理方式。你的循环看起来像前缀和操作。有快速并行算法和实现可用于前缀和。例如,this question