对于二次筛,没有实现优化

时间:2016-05-03 18:39:04

标签: c++ parallel-processing openmp

我正在尝试使用open mp实现平行二次筛。在筛分阶段,我使用对数近似来检查可分性。这是我的代码。

    #pragma omp parallel for schedule (dynamic) num_threads(4)
    for (int i = 0; i < factorBase.size(); ++i) {
        const uint32_t p = factorBase[i];
        const float logp = std::log(factorBase[i]) / std::log(2);

        // Sieve first sequence.
        while (startIndex.first[i] < intervalEnd) {
            logApprox[startIndex.first[i] - intervalStart] -= logp;
            startIndex.first[i] += p;
        }

        if (p == 2)
            continue; // a^2 = N (mod 2) only has one root.

        // Sieve second sequence.
        while (startIndex.second[i] < intervalEnd) {
            logApprox[startIndex.second[i] - intervalStart] -= logp;
            startIndex.second[i] += p;
        }
    }

此处factorbaselogApprox std::vectors初始化如下

std::vector<float> logApprox(INTERVAL_LENGTH, 0);
std::vector<uint32_t> factorBase;

每当我运行此代码并比较运行时间时,顺序和并行运行之间没有太大区别。可以做些什么优化?我是openmp的初学者,感谢任何帮助。谢谢

1 个答案:

答案 0 :(得分:0)

在我看来,你应该把时间表变成静态并给它一个大小(https://software.intel.com/en-us/articles/openmp-loop-scheduling)。

小优化应该是:

在大FOR循环之外,声明一个const并将其初始化为1 / std :: log(2),然后在FOR循环中,而不是除以std :: log(2),执行乘法运算以前的const,除法在CPU周期中非常昂贵。