代码之家  ›  专栏  ›  技术社区  ›  maths soso

OpenMP并行块中出现意外输出

  •  1
  • maths soso  · 技术社区  · 1 年前

    如果我的理解是正确的,下面的程序最多应该创建10个线程并运行omp并行块:

    #include <iostream>
    #include <omp.h>
    using namespace std;
    
    int main()
    {
        omp_set_num_threads(10);
    #pragma omp parallel
        {
            int id = omp_get_thread_num();
    
            printf("%d %d %d\n", id, omp_get_num_threads(), omp_get_max_threads());
        }
        return 0;
    }
    

    输出显示它运行了12次。但是 omp_get_num_threads() = 1 在所有的线程中,并且不知何故 omp_get_max_threads = 12 除了第一个线程。

    输出

    0 1 10
    0 1 12
    0 1 12
    0 1 12
    0 1 12
    0 1 12
    0 1 12
    0 1 12
    0 1 12
    0 1 12
    0 1 12
    0 1 12
    

    我用cmd行编译了完全相同的代码: g++ -fopenmp .\openMp.c -o prog 在VS代码终端中,输出是预期的并且是正确的:

    1 10 10
    2 10 10
    3 10 10
    4 10 10
    0 10 10
    5 10 10
    6 10 10
    7 10 10
    8 10 10
    9 10 10
    
    • 我已将libomp.lib添加到:配置属性>链接器>输入>附加依赖项
    • -fopenmp -Xclang 添加到C/C++的标志>其他选项
    • C/C++>所有选项>打开MP支持>对
    • 不确定是否有libomp.dll,在MSVC安装目录中找不到它。

    笔记 :我使用的是带有12个逻辑处理器的6核CPU。

    1 回复  |  直到 1 年前
        1
  •  2
  •   Ahmed AEK    1 年前

    在MSVC中启用openmp唯一需要做的就是使用

    • C/C++>语言>打开MP支持>对

    此步骤相当于添加一个命令行参数 /openmp

    您看到的问题是由手动链接引起的 libomp.lib ,您应该删除它。 你也不应该通过 -fopenmp -Xclang ,因为这些是clang参数,而不是MSVC参数。

    如果你使用多个编译器和平台,我建议你使用构建系统来自动设置你的工具链,CMake内置了这些标志 How to set linker flags for OpenMP in CMake's try_compile function ,并且包括VSCode和Visual Studio在内的大多数IDE都对CMake有很好的支持,并且您不需要学习每个编译器的怪癖。