centos - 使用 CENTOS 上的所有 CPU 运行 c++ 程序

标签 centos openmp

您好,感谢您的帮助。我一直在运行一个程序,该程序具有许多功能,其中 for 循环迭代超过 10000 次。我一直在使用“#pragma omp_set_num_threads();”使用我的 CENT OS 设备的所有 CPU。这似乎适用于我程序中的所有功能,除了一个。它不起作用的功能是这样的:

void move_check()//function to check if "molecule obj" is in space under consid
{
    for(int i = 0 ; i < NM ; ++i)//NM-no of "molecules"
    {
        int bounds;
        bounds = molecule_obj.at(i).check(dom_x,dom_y,dom_z);
        ////returns status of molecule
        ////molecule is a class that i have created and molecule_obj is an obj of that class.

        if(bounds==1)
        {
            molecule_obj.erase(molecule_obj.begin()+i);
            i -= 1;
            NM -= 1;
        }

    }

}

我可以为此使用 pragma 吗?如果不是,我还有什么其他选择?
由于上述功能似乎是最耗时的功能,我想利用所有 CPU 来执行它。我该怎么做呢?

非常感谢。

最佳答案

是的,原则上您可以使用 OpenMP pragma,只需添加

#pragma omp parallel for

在 for 循环之前。

您必须确保已保存才能使用 molecule_obj 的方法。在平行下。我不知道它们是否是,但我假设如下:molecule_obj.at(i).check(dom_x,dom_y,dom_z);确实适用于一种特定的分子,并且确实依赖于其他任何分子。那还好。

但是 erase函数很可能不是,取决于您如何存储条目。如果你使用类似 std::list , std::vector在循环期间删除元素会导致无效的迭代器、错误的行程计数等。

我建议您通过将其标记为删除来替换循环中条目的删除。为此,您可以为每个分子添加一个特殊标志。
然后在并行循环完成后,您可以串行遍历列表一次并实际删除标记的条目。

只是另一个建议:在一个分子和分子列表之间做出更清晰的区分。它将提高您的代码的可理解性。

关于centos - 使用 CENTOS 上的所有 CPU 运行 c++ 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36265299/

相关文章:

centos - 阻止依赖包在 yum history undo 命令中被删除

Hadoop:数据节点没有启动

c++ - OpenMP 嵌套循环索引依赖

c - 目标和目标数据之间的差异?如何在没有团队指令的情况下进行团队/线程配置?

php - 将 PHP 应用程序部署到 Apache 服务器 Httpd 时出现问题

Nginx 仅在将工作进程用户设置为 root 时有效

centos - 从文件目录创建 RPM

openmp - 使用 OpenMP 拆分 LAPACK 调用

c++ - 为什么他们更喜欢此代码段中的动态调度

c++ - OpenMP:获取正在运行的线程总数