我是否需要在单核计算机上显式禁用OpenMP? 我用OpenMP并行化了一些C++代码。 但是如果我的程序能在单核机器上运行呢

我是否需要在单核计算机上显式禁用OpenMP? 我用OpenMP并行化了一些C++代码。 但是如果我的程序能在单核机器上运行呢,c++,multithreading,optimization,openmp,C++,Multithreading,Optimization,Openmp,我是否需要在运行时禁用使用线程: 检查核心 如果核心>1,则使用OpenMP 否则忽略OpenMP开发 如果是,OpenMP是否有专门的指令?我相信有一个函数叫做: omp_get_num_procs() 这将让您知道有多少处理器可供OpenMP使用。然后有很多方法可以禁用OpenMP。从代码中,您可以运行: omp_set_num_threads(1) 请记住,即使在单核上,您也可以通过OpenMP获得一些提升。这只取决于您的具体情况。不,您不需要禁用OpenMP或线程以在一个内核上运行;

我是否需要在运行时禁用使用线程:

  • 检查核心
  • 如果核心>1,则使用OpenMP
  • 否则忽略OpenMP开发

  • 如果是,OpenMP是否有专门的指令?

    我相信有一个函数叫做:

    omp_get_num_procs()
    
    这将让您知道有多少处理器可供OpenMP使用。然后有很多方法可以禁用OpenMP。从代码中,您可以运行:

    omp_set_num_threads(1)
    
    请记住,即使在单核上,您也可以通过OpenMP获得一些提升。这只取决于您的具体情况。

    不,您不需要禁用OpenMP或线程以在一个内核上运行;对于可能需要的情况,最好在没有OpenMP的情况下显式重新编译,尽管对于复杂的并行化,您也可以采取其他措施,如注释中所述

    当在单个内核甚至硬件线程上运行时,即使您什么都不更改(甚至不更改代码启动的线程数),正确的、无死锁的线程代码仍应正确运行,因为操作系统会在内核上调度各种线程

    现在,线程之间的上下文切换开销很大。典型的OpenMP代码是计算绑定的,依赖于在线程之间分配工作,它将线程数视为一个参数,并在有可用内核或硬件线程时启动尽可能多的线程。对于这样的代码,您只需使用以下结构

    #pragma omp parallel for
    for (i=0; i<N; i++) 
       data[i] = expensive_function(i)
    
    但是现在在没有OpenMP的情况下进行编译变得更加复杂

    总结:

    • 对于大型繁重的计算工作(OpenMP通常用于此),这可能无关紧要;使用OMP_NUM_THREADS=1
      • 通过在不使用OpenMP的情况下进行编译,并将串行运行时与单线程OpenMP运行时进行比较,您可以在开销和禁用优化的情况下测试它是否重要
    • 对于更复杂的线程情况,一般来说很难说得太多;视情况而定

    请记住,OpenMP可能会对仅在一个线程上运行的程序的执行时间造成不必要的开销。这是事实。如果您不想使用它,那么最好的方法是在编译时禁用OpenMP。我只关注了“运行时”案例;)是的,我认为在单核机器上,线程可能会增加开销,不使用线程是很好的。但我不能在编译时禁用它,因为我不知道客户端的环境:它可以是具有多个核心的服务器,也可以是具有一个核心的简单机器(例如用于测试我的软件)@mateuszklinert,omp_set_num_threads(1)只在一个线程中运行omp?可能有类似于#pragma omp parallel if(cores>1)的东西。如果这个条件不是真的,那么代码顺序执行是的,它只将线程数限制为一个。有这样一种结构:
    #pragma omp parallel for schedule(静态)if(标量表达式)
    nThreadMax = imp_get_max_threads();
    #pragma omp parallel if (nThreadMax > 1)  
    if (omp_in_parallel()) {
        // Parallel code path
    } else {
        // Serial code path  
    }