【发布时间】:2020-07-08 15:54:46
【问题描述】:
我尝试使用 MS Visual Studio 2017 运行此代码,我的 CPU 有 48 个线程。
#include <stdio.h>
#include <omp.h>
int main() {
#pragma omp parallel num_threads(4)
{
int i = omp_get_thread_num();
printf_s("Hello from thread %d\n", i);
}
}
我希望得到这样的输出
Hello from thread 0
Hello from thread 1
Hello from thread 2
Hello from thread 3
但实际上我得到了这个输出
Hello from thread 0
到目前为止,我已经做了以下事情
- 在项目设置中启用 openMP:属性 -> C/C++ -> 语言 -> OpenMP
- 将环境变量 OMP_DYNAMIC 设置为 FALSE
我的问题是我缺少什么?为什么它不打印来自多个线程的输出?
【问题讨论】:
-
每个线程要做的工作如此之少,与只在同一个线程上运行所有东西相比,产生单个线程的开销似乎很愚蠢。我猜测您的 OpenMP 实现或编译器只是很聪明,并意识到在此处使用多个线程只会损害性能。不过纯属猜测。
-
我猜你的 Visual Studio 设置让你很困惑(例如,运行时构建不同于调试构建或类似的东西)。如果您有 Visual Studio,您应该能够找到“VS* 的开发人员命令提示符”,这样您就可以确保编译正确并且不会陷入 MSVC 设置。用例如编译cl /openmp hello.c
-
因为我们很确定这是一个编译器问题,所以我取消了我最初的答案,以显示您可以在 Visual Studio 中启用 openmp 的位置,希望这将是一个真实的答案。
-
@Thomas 这不是 OpenMP 的工作方式。并行区域在所有线程中执行,如果编译正确,所示代码应产生所示输出。
-
@JesperJuhl 我不知道任何编译器在基于优化假设启用时会忽略 OpenMP 编译指示,而且它会直接违反 OpenMP 规范。
标签: c++ multithreading visual-studio-2017 openmp