Parallel processing 如何在c语言中实现并行前缀和算法?

Parallel processing 如何在c语言中实现并行前缀和算法?,parallel-processing,openmp,Parallel Processing,Openmp,这是我的密码 #include <stdio.h> #include <omp.h> #include <math.h> int main(int argc, char const *argv[]) { int i,s=0,j,c=8; int a[]={3,1,0,4,2,1,2,3}; int l=ceil(log10(c)/log10(2)); #pragma omp parallel for for (i =

这是我的密码

#include <stdio.h>
#include <omp.h>
#include <math.h>
int main(int argc, char const *argv[])
{
    int i,s=0,j,c=8;
    int a[]={3,1,0,4,2,1,2,3};
    int l=ceil(log10(c)/log10(2));
    #pragma omp parallel for
     for (i = 1; i < c-1; ++i)
    {   
        for (j = 0; j <l ; j++)
        {
            if(i-pow(2,j)>=0){
            a[i]+=a[(i-(int)pow(2,j))];//printf("%i %i %i %i\n", i,j,a[i],a[(i-(int)pow(2,j))]);
        }
        }   
    }
   for (i = 0; i < c; ++i)
    {
        printf("%i\n",a[i]);
    }
    return 0;
}
#包括
#包括
#包括
int main(int argc,char const*argv[]
{
int i,s=0,j,c=8;
int a[]={3,1,0,4,2,1,2,3};
int l=ceil(log10(c)/log10(2));
#pragma-omp并行
对于(i=1;i
但我得到了错误的答案,我发现我得到了错误的答案,因为pragma循环是按顺序工作的,数组a在所有迭代完成之前得到了更新。 我用了这个算法

for all Pi where 1<=i<=n-1
    for j = 1 to ceil(log n) -1 
        if(i- pow(2,j)>=0)
            a[i ] = a[i] + a[i - 2j]

对于我在书中添加了上述算法的所有Pi,请先发布一个工作程序
i
j
都需要保密。其次,循环之间存在相互依赖关系<代码>一个[i-(int)pow(2,j)]
可以由一个线程在与当前线程不同的
i
迭代中进行编辑,从而导致竞争条件。你必须从根本上改变你的算法;这不是一个并行算法。我在我的书中添加了上述算法。你可以先发布一个工作程序吗?
i
j
都需要保密。其次,循环之间存在相互依赖关系<代码>一个[i-(int)pow(2,j)]
可以由一个线程在与当前线程不同的
i
迭代中进行编辑,从而导致竞争条件。你必须从根本上改变你的算法;这不是一个并行算法。