我试图在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,您应该将线程数设置为物理核心数,而不是超线程数。