1

我有一个据说可以并行工作的 C++ 程序(源代码)。但是,如果我使用 g++ 编译它(我使用的是 Ubuntu 10.04 和 g++ 4.4.3)并运行它,我的两个 CPU 内核中的一个会满负荷运行,而另一个则“什么都不做”。

所以我和给我这个程序的那个人谈了。有人告诉我,我必须为 g++ 设置特定的标志,以便为 2 个 CPU 内核编译程序。但是,如果我查看代码,我找不到任何指向并行性的行。

所以我有两个问题:

  • 多线程应用程序是否有任何 C++ 内在函数,即是否可以在没有任何额外库的情况下编写并行代码(因为我没有找到包含任何非标准库)?
  • 确实有 g++ 的标志告诉编译器为 2 个 CPU 内核编译程序并编译它以便并行运行(如果:它们是什么)?
4

4 回答 4

3

AFAIK没有编译器标志旨在使单线程应用程序利用并行性(这绝对是一个不平凡的操作),除了循环迭代的并行化(-ftree-parallelize-loops),仍然必须小心激活;尽管如此,即使没有显式创建线程,也可能有一些OpenMP指令来并行化多个指令序列。

于 2010-06-14T07:46:45.890 回答
2

在源代码中查找“thread”和/或“std::thread”的出现。

于 2010-06-14T08:06:26.040 回答
1

当前的 C++ 语言标准不支持语言或标准库中的多处理。提议的 C++0x 标准确实对线程、锁等有一些支持。我不知道 g++ 的任何标志会神奇地使您的程序进行多处理,而且很难看出这些标志可以做什么。

于 2010-06-14T07:47:51.800 回答
1

我唯一能想到的就是openMosix或者LinuxPMI(openMosix 的继承者)。如果代码使用进程,那么进程“迁移”技术使得进程可以在不同的机器上工作(安装了指定的 linux 发行版)。

检查代码中的线程(grep -i thread)、进程(grep fork)。如果这些都不存在,则检查MPI。我记得 MPI 需要一些额外的配置(仅在教师的一些作业中使用它)。

如前所述,gcc(和其他)通过一些 pragma 实现了一些与OpenMP并行的方式。

于 2010-06-14T12:26:12.560 回答