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