【问题标题】:OpenMP in Qt on VirtualBox uses only one threadVirtualBox 上 Qt 中的 OpenMP 仅使用一个线程
【发布时间】:2015-09-25 17:20:07
【问题描述】:

我正在尝试在 VirtualBox 上的 Linux 中的 QtCreator 中使用 OpenMP 并行化 C++ 程序的一部分。主机系统有 4 核 cpu。由于我最初尝试使用 openmp pragma 似乎没有奏效(使用 openmp 的代码与没有使用 openmp 的代码几乎相同),我回到 OpenMP wiki 并尝试运行这个简单的示例。

    int main(void)
    {
      #pragma omp parallel
        printf("Hello, world.\n");
      return 0;
    }

输出只是

'Hello, world'.

我也试过运行这段代码

int main () {
    int thread_number;
    #pragma omp parallel private(thread_number)
    {
        #pragma omp for schedule(static) nowait
        for (int i = 0; i < 50; i++) {
            thread_number = omp_get_thread_num();
            cout << "Thread " << thread_number << " says " << i << endl;
        }
    }
    return 0;
}

输出是:

Thread 0 says 0
Thread 0 says 1
Thread 0 says 2
.
.
.
.
Thread 0 says 49

所以看起来毕竟没有并行化发生。我已经设置了 QMAKE_CXXFLAGS+= -fopenmp .pro 文件中的 QMAKE_LFLAGS += -fopenmp。发生这种情况是因为我是从虚拟机运行它吗?如何在这里使多线程工作?我真的很感激任何建议/指针。谢谢你。

【问题讨论】:

  • 只用 g++ -fopenmp omp.cpp &amp;&amp; ./a.out 编译该代码为我输出 4x Hello World,所以你的 virtualbox 出了问题,也许试试 qemu?
  • 多线程在虚拟机中运行良好,即使它们只模拟单个 CPU 内核。可能是 -fopenmp 选项没有进入编译器选项,或者您正在使用不支持 OpenMP(尚)的 Clang。

标签: c++ multithreading qt openmp


【解决方案1】:

您的问题是 VirtualBox 始终默认为具有一个内核的机器。转到设置/系统/处理器并将 CPU 的数量增加到硬件线程的数量(在您的情况下为 4 个,如果您有超线程,则为 8 个)。如果你有超线程,VirtualBox 会警告你你选择的 CPU 比物理 CPU 多。忽略警告。

我将 CPU 设置为 8。当我在 Windows 上的 GCC 中使用 OpenMP 时,我得到了 8 个线程。

编辑:根据VirtualBox's manaual,您应该将线程数设置为物理内核数而不是超线程数。

但是,您不应将虚拟机配置为使用比物理上可用的更多的 CPU 内核(真实内核,无超线程)。

【讨论】:

    【解决方案2】:

    尝试设置环境变量 OMP_NUM_THREADS。如果您的虚拟机说它有一个单核(这发生在我身上),默认值可能是 1。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      相关资源
      最近更新 更多