0

我想并行外部 for 循环,但我尝试了下面的说明,结果证明是错误的。我希望你能帮助解决这个问题。

    #pragma omp parallel for private(i,ii,j) reduction(+:Number1)
    for(ii=1;ii<numbers_of_sieve;ii++)
    {
        for(j=0;j<area;j++)
            flags[j]=1;

        int a=sqrt((double)(1+ii))*1024;
        for(int k=0;k<Number;k++)
        {
            if(sieve[k]<=a)
            {
                __int64 x=(sieve[k]+(-(ii*area))%sieve[k])%sieve[k];

                for(__int64 m=ii*area+x;m<(1+ii)*area;m+=sieve[k])
                    flags[m-ii*area]=0;
            }
        }

        for(i=0;i<(1<<20);i++)
        {
            if(flags[i]==1)
            {
                //fprintf(fp,"%I64d\t",i+ii*area);
                Number1++;
            }
        }
    }

谢谢!

4

1 回答 1

0

我不知道你的“结果是错误的”是什么意思。但是标志(数组?)必须声明为私有,或者必须在循环内声明。

附言

在尝试以并行模式运行之前,请检查您的程序在串行模式下是否正常工作。例如,比较两行:

   for(j=0;j<area;j++)

    for(i=0;i<(1<<20);i++)

想想——如果area != (1<<20)或会是什么size of flags != area

于 2013-11-06T04:36:10.207 回答