我正在尝试在 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/