OMP for 循环条件不是简单的关系比较

发布于 2025-01-14 23:04:36 字数 869 浏览 4 评论 0原文

我的程序由于错误而无法编译:OpenMP for 循环的条件必须是关系比较('<'、'<='、'>'、'>=' 或循环变量'i'的'!='),参考for (size_t i = 2; i * i <= n; i++)。如何修改和修复它而不影响性能?这是由于 OpenMP 版本旧而导致的问题吗? (因为我记得以前在另一台旧版本的计算机上遇到过不同的问题,现在已经解决了。)

#include <iostream>
#include <cstdio>

int main(int argc, char **argv)
{
    if (argc != 2)
        return EXIT_FAILURE;
    size_t n;
    if (sscanf(argv[1], "%zu", &n) == 0)
        return EXIT_FAILURE;
    auto *prime = new size_t[n + 1];
    for (size_t i = 2; i <= n; i++)
        prime[i] = i;
    #pragma omp parallel for
    for (size_t i = 2; i * i <= n; i++)
        for (size_t j = i * i; j <= n; j += i)
            prime[j] = 0;
    size_t N = 0;
    for (size_t i = 2; i <= n; i++)
        if (prime[i] != 0)
            N++;
    std::cout << N << '\n';
}

I have this program that isn't compiling due to error: condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i', referring to for (size_t i = 2; i * i <= n; i++). How can I modify and fix it without affecting performance? Is this an issue due to having an old OpenMP version? (Because I remember having a different issue before on another computer with an older version that is resolved now.)

#include <iostream>
#include <cstdio>

int main(int argc, char **argv)
{
    if (argc != 2)
        return EXIT_FAILURE;
    size_t n;
    if (sscanf(argv[1], "%zu", &n) == 0)
        return EXIT_FAILURE;
    auto *prime = new size_t[n + 1];
    for (size_t i = 2; i <= n; i++)
        prime[i] = i;
    #pragma omp parallel for
    for (size_t i = 2; i * i <= n; i++)
        for (size_t j = i * i; j <= n; j += i)
            prime[j] = 0;
    size_t N = 0;
    for (size_t i = 2; i <= n; i++)
        if (prime[i] != 0)
            N++;
    std::cout << N << '\n';
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

橘亓 2025-01-21 23:04:36

#pragma omp parallel for 之后的循环必须是 规范形式待确认。在您的情况下,问题在于测试表达式,它应该是以下之一:

var relational-op b
b relational-op var

因此,您必须使用@Yakk建议的内容:计算nsqrt > 并将其与 i 进行比较:

const size_t max_i=sqrt(n);
#pragma omp parallel for
  for (size_t i = 2; i <= max_i; i++)
  ....

Loop after the #pragma omp parallel for have to be a canonical form to be confirming. In your case the problem is with the test expression, which should be one of the following:

var relational-op b
b relational-op var

So, you have to use what was suggested by @Yakk: calculate the sqrt of n and compare it to i:

const size_t max_i=sqrt(n);
#pragma omp parallel for
  for (size_t i = 2; i <= max_i; i++)
  ....
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文