我试图在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。这是因为我是从虚拟机运行它吗?如何在这里进行多线程工作?我真的很感激任何建议/指针。谢谢。
答案 0 :(得分:1)
您的问题是VirtualBox始终默认为具有一个核心的计算机。转到设置/系统/处理器并将CPU数量增加到硬件线程数(例如,在您的情况下为4或如果您有超线程,则为8)。如果您有超线程,VirtualBox会警告您选择了比物理CPU更多的CPU。忽略警告。
我将CPU设置为8。当我在Windows上的GCC中使用OpenMP时,我得到八个线程。
编辑:根据VirtualBox's manaual,您应该将线程数设置为物理核心数而不是超线程数。
但是,您不应该将虚拟机配置为使用比实际可用内核更多的CPU内核(真实内核,没有超线程)。
答案 1 :(得分:0)
尝试设置环境变量OMP_NUM_THREADS。如果您的虚拟机说它有一个核心(这发生在我身上),则默认值可能为1.