openmp,用于循环并行化和临界区错误

时间:2015-12-22 09:40:21

标签: openmp

我是OpenMP的新用户,我正在使用它来实现Sieve of Eratosthenes,我的代码是:

int check_eratothenes(int *p, int pn, int n)
{
    int count = 0;
    bool* out = new bool[int(pow(pn, 2))];
    memset(out, 0, pow(pn, 2));
    #pragma omp parallel 
    for (int i = 0; i < n; i ++)
    {
        int j = floor((pn + 1) / p[i]) * p[i];
        #pragma omp critical
        while (j <= pow(pn, 2))
        {
            out[j] = 1;
            j += p[i];
        }
    }
    #pragma omp parallel 
    for (int i = pn+1; i < pow(pn, 2); i ++)
    {
        #pragma omp critical
        if (out[i] == 0)
        {
            //cout << i << " ";
            count ++;
        }
    }
    return count;
}

但是,上面的OpenMP编译指示是错误的。它可以被编译但是当它运行时,需要花费很多时间才能得到结果,因此按CTRL + C停止。我对如何解决它感到茫然。因为有很多循环和if语句。

提前致谢。

0 个答案:

没有答案