c++ - Qt on VirtualBox 中的 OpenMP 仅使用一个线程

标签 c++ multithreading qt openmp

我正在尝试在 VirtualBox 上的 Linux 中的 QtCreator 中使用 OpenMP 并行化部分 C++ 程序。主机系统有4core cpu。由于我最初尝试使用 openmp pragmas 似乎没有奏效(使用 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。发生这种情况是因为我从虚拟机运行它吗?我如何在这里使多线程工作?我真的很感激任何建议/指示。谢谢你。

最佳答案

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

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

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

You should not, however, configure virtual machines to use more CPU cores than you have available physically (real cores, no hyperthreads).

关于c++ - Qt on VirtualBox 中的 OpenMP 仅使用一个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20962363/

相关文章:

c++ - Operator [] 作为非静态函数

c++ - 显示 new() 在 malloc 返回地址调用对象构造函数的源代码

java - 关闭钩子(Hook)不会杀死执行器

c++ - Qt:QGraphicsScene 没有在我期望的时候更新

qt - 获取 QGraphicsItem 内的 QWidget 的位置

c++ - 为什么还用C语言呢?

c++ - 从 void 指针转换(创建通用存储)有什么问题吗?

c# - .NET 进程中可以存在的线程数是否有硬性限制?

从不同纤程调用需要主线程的函数

c++ - Visual Studio 何时生成 32 位 .obj 文件和 64 位 .obj 文件?