OpenMP - 为什么firstprivate 会导致错误?

发布于 2024-10-12 13:00:49 字数 250 浏览 0 评论 0原文

为什么我会收到此错误,我应该做什么?

error: firstprivate variable 'j' is private in outer context

void foo() {
    int i;
    int j = 10;
    #pragma omp for firstprivate(j)
    for (i = 0; i < 10; i++)
        printf("%d\n", j);
}

Why am I getting this error, and what should I do?

error: firstprivate variable 'j' is private in outer context

void foo() {
    int i;
    int j = 10;
    #pragma omp for firstprivate(j)
    for (i = 0; i < 10; i++)
        printf("%d\n", j);
}

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

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

发布评论

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

评论(2

纸短情长 2024-10-19 13:00:49

如果您使用 pragma,它就可以工作。

#pragma omp parallel for firstprivate(j)

请注意,omp foromp parallel for 不是同一件事:后者是 omp for 的简写> 在 omp 并行 内。

It works if you use the pragma

#pragma omp parallel for firstprivate(j)

Note that omp for and omp parallel for aren't the same thing: the latter is shorthand for an omp for inside an omp parallel.

尤怨 2024-10-19 13:00:49

我删除了我的第一个答案,因为我遗漏了一些内容并且它是不正确的。由于 OpenMP V3.0 规范(及之前版本)第 2.9.3.4 节firstprivate 子句,限制项目符号 2 中的限制,该错误是正确的:

• 并行区域内私有的列表项不得出现在并行区域中
工作共享结构上的firstprivate 子句(如果有任何工作共享)
由工作共享结构产生的区域曾经绑定到任何并行的区域
由并行结构产生的区域。

问题在于它不知道在执行工作共享区域的线程中使用哪个私有值。如果它是一个新的并行区域,则每个线程将创建一个新区域,并且firstprivate 是从创建该区域的线程的私有副本中复制的。

I deleted my first answer because I missed something and it was incorrect. The error is correct because of a restriction in the OpenMP V3.0 spec (and previous versions), section 2.9.3.4 firstprivate clause, Restrictions bullet 2:

• A list item that is private within a parallel region must not appear in a
firstprivate clause on a worksharing construct if any of the worksharing
regions arising from the worksharing construct ever bind to any of the parallel
regions arising from the parallel construct.

The problem is that it doesn't know which private value to use among the threads that are to execute the worksharing region. If it is a new parallel region, then each thread will create a new region and the firstprivate is copied from the private copy of the thread creating the region.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文