我正在尝试使用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;
}
}
此处factorbase
和logApprox
std::vectors
初始化如下
std::vector<float> logApprox(INTERVAL_LENGTH, 0);
std::vector<uint32_t> factorBase;
每当我运行此代码并比较运行时间时,顺序和并行运行之间没有太大区别。可以做些什么优化?我是openmp的初学者,感谢任何帮助。谢谢
答案 0 :(得分:0)
在我看来,你应该把时间表变成静态并给它一个大小(https://software.intel.com/en-us/articles/openmp-loop-scheduling)。
小优化应该是:
在大FOR循环之外,声明一个const并将其初始化为1 / std :: log(2),然后在FOR循环中,而不是除以std :: log(2),执行乘法运算以前的const,除法在CPU周期中非常昂贵。