代码之家  ›  专栏  ›  技术社区  ›  Cosmin Ioniță

如何使用OpenMP任务实现缩减?

  •  0
  • Cosmin Ioniță  · 技术社区  · 7 年前

    我有一个执行简单简化的OpenMP代码:

    for(k = 0; k < m; k++) 
    {
          #pragma omp parallel for private(i) reduction(+:mysum) schedule(static) 
          for (i = 0; i < m; i++)
          {
               mysum += a[i][k] * a[i][k];
          }
    }
    

    我想创建一个与此代码等效的代码,但使用OpenMP任务。以下是我通过以下方式尝试的内容 this 第条:

    for(k = 0; k < m; k++) 
    {
        #pragma omp parallel reduction(+:mysum)
        {
             #pragma omp single 
             {
                      for (i = 0; i < m; i++) 
                      {
                            #pragma omp task private(i) shared(k)
                            {
                                    partialSum += a[i][k] * a[i][k];
                            }
                       }
             }
    
             #pragma omp taskwait
             mysum += partialSum;
         }
     }
    

    变量 partialSum threadprivate 它也是一个全局变量:

    int partialSum = 0;
    #pragma omp threadprivate(partialSum)
    

    a 是一个简单的整数数组(m x m)。

    问题是,当我多次运行上面的代码(带有任务的代码)时,会得到不同的结果。

    谨此致谢

    1 回复  |  直到 7 年前
        1
  •  1
  •   Zulan    7 年前

    private 变量未初始化(至少未通过其外部值初始化)。 i 应该是 firstprivate .

    如果你能摆脱 private(i) shared(k) k 来自外部的 parallel 节,因此是隐式的 shared 节。这也暗含了它 共享 在任务生成构造中。马上 也是共享的。如果您在本地定义它( for (int i... ),它隐式地变为 私有的 一等兵

    您还应该添加

    #pragma omp atomic
    mysum += partialSum;
    

    另一方面,您不一定需要 taskwait this answer

    注意,谈话使用 一等兵