#pragma omp parallel for schedule使我的程序崩溃

DontCare熊

我正在用C ++构建适用于Autodesk Maya 2013的插件。我必须尽快解决一系列优化问题。我为此任务使用了开放式MP。问题是我在并行计算方面没有太多经验。我尝试使用:

#pragma omp parallel for schedule (static)

在我的for循环上(对它应该如何工作没有足够的了解),它对我的​​某些代码非常有效,但是使我的另一部分代码崩溃了。

这是一个由于omp指令而崩溃的函数示例:

void PlanarizationConstraint::fillSparseMatrix(const Optimizer& opt, vector<T>& elements, double mu)
{
    int size = 3;
    #pragma omp parallel for schedule (static)
    for(int i = 0; i < opt.FVIc.outerSize(); i++)
    {
        int index = 3*i;
        Eigen::Matrix<double,3,3> Qxyz = Eigen::Matrix<double,3,3>::Zero();
        for(SpMat::InnerIterator it(opt.FVIc,i); it; ++it)
        {
            int face = it.row();
            for(int n = 0; n < size; n++)
            {
                Qxyz.row(n) += N(face,n)*N.row(face);
                elements.push_back(T(index+n,offset+face,(1 - mu)*N(face,n)));
            }
        }

        for(int n = 0; n < size; n++)
        {
            for(int k = 0; k < size; k++)
            {
                elements.push_back(T(index+n,index+k,(1-mu)*Qxyz(n,k)));
            }
        }
    }

    #pragma omp parallel for schedule (static)
    for(int j = 0; j < opt.VFIc.outerSize(); j++)
    {
        elements.push_back(T(offset+j,offset+j,opt.fvi[j]));
        for(SpMat::InnerIterator it(opt.VFIc,j); it; ++it)
        {
            int index = 3*it.row();
            for(int n = 0; n < size; n++)
            {
                elements.push_back(T(offset+j,index+n,N(j,n)));
            }
        }
    }
}

这是一个代码示例,可以很好地与这些指令配合使用(并且因此速度更快)

Eigen::MatrixXd Optimizer::OptimizeLLGeneral()
{
    ConstraintsManager manager;
    SurfaceConstraint surface(1,true);
    PlanarizationConstraint planarization(1,true,3^Nv,Nf);
    manager.addConstraint(&surface);
    manager.addConstraint(&planarization);
    double mu = mu0;
    for(int k = 0; k < iterations; k++)
    {
        #pragma omp parallel for schedule (static)
        for(int j = 0; j < VFIc.outerSize(); j++)
        {
            manager.calcVariableMatrix(*this,j);
        }
        #pragma omp parallel for schedule (static)
        for(int i = 0; i < FVIc.outerSize(); i++)
        {
            Eigen::MatrixXd A = Eigen::Matrix<double, 3, 3>::Zero();
            Eigen::MatrixXd b = Eigen::Matrix<double, 1, 3>::Zero();
            manager.addLocalMatrixComponent(*this,i,A,b,mu);
            Eigen::VectorXd temp = b.transpose();
            Q.row(i) = A.colPivHouseholderQr().solve(temp);
        }
        mu = r*mu;
    }
    return Q;
}

我的问题是什么使一个函数与omp指令配合得如此好,又使另一个函数崩溃?使omp指令的行为不同有什么区别?

kangshiyin

在使用openmp之前,您将一些数据elements一一推回向量中但是,对于openmp,将有多个线程在for循环中并行运行代码。当有多个线程同时将数据推回向量elements时,并且没有代码确保一个线程在另一线程完成之前不会开始推入时,就会发生问题。这就是代码崩溃的原因。

要解决此问题,您可以使用局部增益向量。每个线程首先将数据推送到其私有本地缓冲区向量,然后可以将这些缓冲区向量连接在一起成为单个向量。

您会注意到,此方法不能保持向量中数据元素的原始顺序elements如果要这样做,可以计算数据元素的每个预期索引,然后将数据直接分配到正确的位置。

更新

OpenMP提供了API,可让您知道使用了多少线程以及正在使用哪个线程。请参阅omp_get_max_threads()omp_get_thread_num()了解更多信息。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

#pragma omp parallel for schedule使我的程序崩溃

来自分类Dev

#pragma omp parallel和#pragma omp parallel之间的区别

来自分类Dev

#pragma parallel for crash和#pragma omp parallel for之间的区别

来自分类Dev

Pragma OMP平行于vs. 实用程序并行

来自分类Dev

与“ #pragma omp single”相比,“#pragma omp master”有什么好处?

来自分类Dev

使用pragma omp simd这样正确吗?

来自分类Dev

c中的pragma omp快捷方式

来自分类Dev

英特尔的pragma simd与OpenMP的pragma omp simd

来自分类Dev

“ #pragma omp master”相对于“ #pragma omp single”有什么好处?

来自分类Dev

了解!$ omp parallel do reduction(...)的正确用法

来自分类Dev

通过将#omp parallel和#omp for分开来减少OpenMP fork / join的开销

来自分类Dev

内部嵌套循环的Pragma omp在嵌套循环(C ++)中未正确忽略

来自分类Dev

为什么“#pragma omp critical”部分不能在同一行上有大括号?

来自分类Dev

OMP Single用于输出子程序

来自分类Dev

如何使用 `omp parallel` 或其他方式并行化 for 循环?

来自分类Dev

如何使用#pragma clang诊断程序

来自分类Dev

OpenMP:为什么没有#pragma openmp parallel应该有用?

来自分类Dev

与omp并行

来自分类Dev

OpenMP PARALLEL DO中的子例程-程序崩溃

来自分类Dev

#pragma警告禁用数组初始化程序中的忽略

来自分类Dev

sqlite我怎么知道PRAGMA“查询”返回的列名是什么?

来自分类Dev

在无法应用 omp atomic/reduction 的情况下,我们可以使用 omp critical 来提高效率吗?

来自分类Dev

在程序源文件中使用脚本变量OMP_NUM_THREADS

来自分类Dev

OMP并行化fortran程序的指针/副本的注意事项是什么

来自分类Dev

OMP_set_dynamic()比我预期的有用吗?

来自分类Dev

为什么我会在此 omp_declare_reduction 中收到此错误?

来自分类Dev

使用Gnu Parallel对我的程序运行测试文件夹

来自分类Dev

为什么使用Parallel :: Loops的程序会耗尽我的内存?

来自分类Dev

与omp卡住平行

Related 相关文章

  1. 1

    #pragma omp parallel for schedule使我的程序崩溃

  2. 2

    #pragma omp parallel和#pragma omp parallel之间的区别

  3. 3

    #pragma parallel for crash和#pragma omp parallel for之间的区别

  4. 4

    Pragma OMP平行于vs. 实用程序并行

  5. 5

    与“ #pragma omp single”相比,“#pragma omp master”有什么好处?

  6. 6

    使用pragma omp simd这样正确吗?

  7. 7

    c中的pragma omp快捷方式

  8. 8

    英特尔的pragma simd与OpenMP的pragma omp simd

  9. 9

    “ #pragma omp master”相对于“ #pragma omp single”有什么好处?

  10. 10

    了解!$ omp parallel do reduction(...)的正确用法

  11. 11

    通过将#omp parallel和#omp for分开来减少OpenMP fork / join的开销

  12. 12

    内部嵌套循环的Pragma omp在嵌套循环(C ++)中未正确忽略

  13. 13

    为什么“#pragma omp critical”部分不能在同一行上有大括号?

  14. 14

    OMP Single用于输出子程序

  15. 15

    如何使用 `omp parallel` 或其他方式并行化 for 循环?

  16. 16

    如何使用#pragma clang诊断程序

  17. 17

    OpenMP:为什么没有#pragma openmp parallel应该有用?

  18. 18

    与omp并行

  19. 19

    OpenMP PARALLEL DO中的子例程-程序崩溃

  20. 20

    #pragma警告禁用数组初始化程序中的忽略

  21. 21

    sqlite我怎么知道PRAGMA“查询”返回的列名是什么?

  22. 22

    在无法应用 omp atomic/reduction 的情况下,我们可以使用 omp critical 来提高效率吗?

  23. 23

    在程序源文件中使用脚本变量OMP_NUM_THREADS

  24. 24

    OMP并行化fortran程序的指针/副本的注意事项是什么

  25. 25

    OMP_set_dynamic()比我预期的有用吗?

  26. 26

    为什么我会在此 omp_declare_reduction 中收到此错误?

  27. 27

    使用Gnu Parallel对我的程序运行测试文件夹

  28. 28

    为什么使用Parallel :: Loops的程序会耗尽我的内存?

  29. 29

    与omp卡住平行

热门标签

归档