C++ 二次筛未实现优化的omp并行

C++ 二次筛未实现优化的omp并行,c++,parallel-processing,openmp,C++,Parallel Processing,Openmp,我正在尝试使用openmp实现并行二次筛。在筛选阶段,我使用对数近似来检查整除性。这是我的密码 #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(factorBa

我正在尝试使用openmp实现并行二次筛。在筛选阶段,我使用对数近似来检查整除性。这是我的密码

    #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;
        }
    }

无论何时,我运行这段代码并比较运行时间,顺序运行和并行运行之间没有太大区别。可以进行哪些优化?我是openmp的初学者,非常感谢您的帮助。谢谢

在我看来,您应该将时间表设置为静态,并为其设置块大小()

一个小的优化应该是:


在big FOR循环外部,声明一个常量并将其初始化为1/std::log(2),然后在FOR循环内部,不是除以std::log(2),而是乘以前面的常量,除法在CPU周期中非常昂贵。

使用探查器识别瓶颈,然后分析瓶颈,然后消除瓶颈。好的,谢谢你的建议。
std::vector<float> logApprox(INTERVAL_LENGTH, 0);
std::vector<uint32_t> factorBase;