归约变量在外部环境中是私有的

梦境崩溃

我有以下代码:

void simulation (MD *md){

    double sum;
    #pragma omp parallel private (move)
    {

        for(move = 0; move < maxIterations; ++move)
        {
                cicleDoMove(md);
                cicleForces(md);
                cicleMkekin(md,sum);
                // ...
        }
    }
}

在哪里 :

void cicleMkekin(Md *md, double sum){

    #pragma omp for reduction(+ : sum)
    for (i = 0; i < md->mdsize; i++)
    {
        sum += mkekin(..);
    }
    // .. 
}

我收到以下错误:

"reduction variable 'sum' is private in outer context"

实际上,如果我将模拟代码更改为:

 void simulation (MD *md){

        double sum;
        #pragma omp parallel private (move)
        {

            for(move = 0; move < maxIterations; ++move)
            {
                    cicleDoMove(md);
                    cicleForces(md);

                    #pragma omp for reduction(+ : sum)
                    for (i = 0; i < md->mdsize; i++)
                    {
                         sum += mkekin(..);
                    }
                    // ...
            }
        }
    }

它完美地工作。

无论如何,我可以使用我的第一个代码版本而不会收到该错误吗?还是我做错了什么?

斯蒂芬·霍尔德曼斯

在这种特殊情况下,OpenMP可能会有些混乱。规范规定(第2.14.3.6节):

在工作共享构造的归约子句中出现的列表项必须在平行区域中共享,该并行区域是由工作共享构造引起的任何工作共享区域绑定到的。

此外,对于C和C ++,它说(§2.14.1.1)

在构造内部的作用域中声明的具有自动存储期限的变量是私有的。

在您的情况下,变量sum在函数调用的范围内声明,cicleMkekin并且作为函数参数具有自动存储持续时间。因此,当您cicleMkekin在并行区域内(或为此,从与程序执行一致的隐式顶级并行区域)进行调用时sum被视为私有变量。结果,您的reduce子句确实是非法的,实际上,您所收到的错误消息令人困惑,可能使您感到困惑。

在您手动内联到的调用的代码版本中,您在并行区域之外cicleMkekin声明了变量sum此类变量在没有default子句或该变量的所谓的明确确定的数据共享属性的情况下,确实是共享的(第2.14.1节),因此,该reduction代码版本中子句是合法的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在没有外部环境帮助的情况下在javascript闭包中传递参数并保持内存?

来自分类Dev

使用docker compose将环境变量从外部环境文件传递到容器

来自分类Dev

从嵌套的私有类内部在外部类中使用C ++公共变量

来自分类Dev

如何在Box2D中创建世界而不离开未解决的外部环境

来自分类Dev

如何从外部更改JavaScript方法中私有变量的值?

来自分类Dev

“私有变量不能归约”,尽管该变量在SIMD块之外定义

来自分类Dev

将变量存储在外部文件中

来自分类Dev

外部环境上的Symfony内置Web服务器

来自分类Dev

重载的私有函数,它在clojure中是私有的

来自分类Dev

如何在 swift 中理解设置为私有的全局变量?

来自分类Dev

从外部范围引用私有变量

来自分类Dev

在外部定义外部变量

来自分类Dev

OpenMP共享变量似乎是私有的

来自分类Dev

R降价以使用环境中现有的变量而不再运行代码

来自分类Dev

如何在现有的Docker容器中永久设置环境变量?

来自分类Dev

为什么可以从javascript中的函数外部访问匿名函数中的私有变量?

来自分类Dev

为什么私有主页不是通过会话/登录变量私有的

来自分类Dev

Fedora ia_64 chroot环境-grub正在保留外部环境

来自分类Dev

调用存储在外部文件中的许多变量

来自分类Dev

我无法在外部javascript文件中访问freemarker变量

来自分类Dev

angularjs作用域变量未在外部指令中更新

来自分类Dev

在外部链接的javascript中渲染EL变量

来自分类Dev

在外部Apply语句sql中设置变量

来自分类Dev

调用存储在外部文件中的许多变量

来自分类Dev

在外部ajax search.php中访问$ _GET变量

来自分类Dev

angularjs作用域变量未在外部指令中更新

来自分类Dev

如何在外部javascript中从php访问会话变量

来自分类Dev

如何在没有转发规则的情况下将kubernetes容器连接到外部环境(Google容器引擎)

来自分类Dev

C ++将外部变量导入私有类变量

Related 相关文章

  1. 1

    如何在没有外部环境帮助的情况下在javascript闭包中传递参数并保持内存?

  2. 2

    使用docker compose将环境变量从外部环境文件传递到容器

  3. 3

    从嵌套的私有类内部在外部类中使用C ++公共变量

  4. 4

    如何在Box2D中创建世界而不离开未解决的外部环境

  5. 5

    如何从外部更改JavaScript方法中私有变量的值?

  6. 6

    “私有变量不能归约”,尽管该变量在SIMD块之外定义

  7. 7

    将变量存储在外部文件中

  8. 8

    外部环境上的Symfony内置Web服务器

  9. 9

    重载的私有函数,它在clojure中是私有的

  10. 10

    如何在 swift 中理解设置为私有的全局变量?

  11. 11

    从外部范围引用私有变量

  12. 12

    在外部定义外部变量

  13. 13

    OpenMP共享变量似乎是私有的

  14. 14

    R降价以使用环境中现有的变量而不再运行代码

  15. 15

    如何在现有的Docker容器中永久设置环境变量?

  16. 16

    为什么可以从javascript中的函数外部访问匿名函数中的私有变量?

  17. 17

    为什么私有主页不是通过会话/登录变量私有的

  18. 18

    Fedora ia_64 chroot环境-grub正在保留外部环境

  19. 19

    调用存储在外部文件中的许多变量

  20. 20

    我无法在外部javascript文件中访问freemarker变量

  21. 21

    angularjs作用域变量未在外部指令中更新

  22. 22

    在外部链接的javascript中渲染EL变量

  23. 23

    在外部Apply语句sql中设置变量

  24. 24

    调用存储在外部文件中的许多变量

  25. 25

    在外部ajax search.php中访问$ _GET变量

  26. 26

    angularjs作用域变量未在外部指令中更新

  27. 27

    如何在外部javascript中从php访问会话变量

  28. 28

    如何在没有转发规则的情况下将kubernetes容器连接到外部环境(Google容器引擎)

  29. 29

    C ++将外部变量导入私有类变量

热门标签

归档