VirtualBox上的Qt中的OpenMP只使用一个线程

时间:2014-01-07 01:23:46

标签: c++ multithreading qt openmp

我试图在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。这是因为我是从虚拟机运行它吗?如何在这里进行多线程工作?我真的很感激任何建议/指针。谢谢。

2 个答案:

答案 0 :(得分:1)

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

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

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

  但是,您不应该将虚拟机配置为使用比实际可用内核更多的CPU内核(真实内核,没有超线程)。

答案 1 :(得分:0)

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