我试图在VirtualBox上的Linux中的QtCreator中使用OpenMP并行化C++程序的一部分。主机系统具有4core cpu。由于我最初尝试使用openmp编译指示似乎不起作用(使用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设置为八个。当我在Windows的GCC中使用OpenMP时,会得到八个线程。

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

10-07 19:52
查看更多