C++ 如何删除此OpenMP汇总示例中的依赖项
我现在从OpenMP开始,需要在这个任务中使用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
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