C++ 如何删除此OpenMP汇总示例中的依赖项

C++ 如何删除此OpenMP汇总示例中的依赖项,c++,parallel-processing,dependencies,openmp,C++,Parallel Processing,Dependencies,Openmp,我现在从OpenMP开始,需要在这个任务中使用OpenMP实现并行性: for (i = 0; i < N; i++){ index += i*alpha + 4; sum += array[index]; } (i=0;i

我现在从OpenMP开始,需要在这个任务中使用OpenMP实现并行性:

for (i = 0; i < N; i++){
 index += i*alpha + 4;
 sum += array[index];
}
(i=0;i{ 指数+=i*alpha+4; sum+=数组[索引]; } 我打算使用归约运算符来获得sum变量的正确值,但为了做到这一点,我需要首先解决索引变量的依赖关系。 我该怎么做


谢谢你的帮助

由于顺序依赖关系,循环不能直接并行化。但是,它可以首先分为两部分:

(i=0;i{ 指数+=i*alpha+4; tmp[i]=指数; } 对于(i=0;i 一旦分割,第一个循环显示出扫描模式,并且可以并行化,尽管并行版本可能不会比顺序版本快。第二个循环是一个简单的归约,可以很容易地并行化

使用OpenMP执行扫描模式通常有点棘手。希望如此,因为
alpha
似乎是一个循环常数,
索引
的所有值都可以轻松预测,这得益于基本的数学属性:

index_i = index_init + 0*alpha+4 + 1*alpha+4 + 2*alpha+4 + ... + i*alpha+4
        = index_init + (0+1+2+...+i)*alpha + 4*(i+1)
        = index_init + (i*(i+1)/2)*alpha + 4*(i+1)
        = index_init + (i+1)*(i*alpha + 8)/2
因此,我们可以编写最终生成的代码:

#pragma-omp-parallel用于归约(+:sum)
对于(i=0;i
此外,如果
alpha
是一个整数,并且
index
从零开始,则可以使数组索引稍微快一点:

#pragma-omp-parallel用于归约(+:sum)
对于(i=0;i