如果项目刚刚使用OpenMP构建,可能会发生什么差异

时间:2015-09-09 08:52:02

标签: c++ openmp

我使用Visual Studio 2012在c ++中工作。我想知道以下这些案例之间的区别,

  1. 我已经通过启用openmp构建了我的应用程序,但我没有进行并行编程。我的意思是我没有在我的任何代码中使用#pragma等。

  2. 我通过禁用openmp构建了我的应用程序,但我没有进行任何并行编程。

  3. 在这种情况下,可能出现什么样的变化或问题,例如应用程序大小等。

2 个答案:

答案 0 :(得分:2)

使用OpenMP进行编译可能会产生一些影响,即使没有启用OpenMP指令也是如此。但是,从代码的结果来看,它不应该有任何区别。由于编译器选择了一组不同的启发法来优化代码,因此只能在性能方面产生影响。例如,在为OpenMP编译时(即使代码中不包含OpenMP指令),可以禁用消耗大量内存带宽的积极优化,同时为非并行代码启用这些优化。同样,编译OpenMP通常意味着链接到线程安全版本的库(如果适用),这可能比非线程安全版本稍微优化一些。但总的来说,我怀疑你会发现任何不同之处,除非你陷入极端的角落。

举个例子,这里是英特尔C编译器(旧)版本手册页的摘录:

    -opt-mem-bandwidth<n> (i64, L*X only)
          Enables  or  disables  performance  tuning and heuristics
          that control memory bandwidth use among  processors.   It
          allows  the compiler to be less aggressive with optimiza-
          tions that might consume  more  bandwidth,  so  that  the
          bandwidth  can  be  well-shared among multiple processors
          for a parallel program.  For values of <n>  greater  than
          0,  the option tells the compiler to enable a set of per-
          formance tuning and heuristics in compiler  optimizations
          such   as  prefetching,  privatization,  aggressive  code
          motion, and so forth, for reducing memory bandwidth pres-
          sure   and   balancing  memory  bandwidth  traffic  among
          threads.  The <n> value is the level  of  optimizing  for
          memory  bandwidth  usage. You can specify one of the fol-
          lowing values for <n>:

          0 -- Disables a set of performance tuning and  heuristics
          in compiler optimizations for parallel code.  This is the
          default for serial code.

          1 -- Enables a set of performance tuning  and  heuristics
          in  compiler  optimizations for multithreaded code gener-
          ated by the compiler.  This is the  default  if  compiler
          option  -parallel  or  -openmp  is  specified, or Cluster
          OpenMP option -cluster-openmp is specified (see the Clus-
          ter OpenMP documentation).

          2  --  Enables a set of performance tuning and heuristics
          in compiler optimizations for parallel code such as  Win-
          dows  Threads,  pthreads,  and  MPI  code, besides multi-
          threaded code generated by the compiler.

正如您所看到的,启用或不启用OpenMP会产生一些可能的性能副作用,因为默认值通常是-opt-mem-bandwidth0,但如果打开了OpenMP支持则变为-opt-mem-bandwidth1。 同样,我记得IBM编译器在多线程代码的性能启发式方面有一些类似的变化。我&#39;不会感到惊讶,这种选择性行为仍然在内部应用,甚至对于Microsoft编译器也是如此。

答案 1 :(得分:1)

绝对没有。以

的简单例子为例
#include <cstdio>

int main()
{
    printf("Hello world\n");
    return 0;
}

输出汇编器完全相同,有/不带/ openmp标志(使用/ O2,但类似的结果没有优化)

; Listing generated by Microsoft (R) Optimizing Compiler Version 17.00.61030.0 

    TITLE
    .686P
    .XMM
    include listing.inc
    .model  flat

INCLUDELIB OLDNAMES

PUBLIC  ??_C@_0N@NLPDAPMJ@Hello?5world?6?$AA@       ; `string'
EXTRN   __imp__printf:PROC
EXTRN   @__security_check_cookie@4:PROC
;   COMDAT ??_C@_0N@NLPDAPMJ@Hello?5world?6?$AA@
CONST   SEGMENT
??_C@_0N@NLPDAPMJ@Hello?5world?6?$AA@ DB 'Hello world', 0aH, 00H ; `string'
CONST   ENDS
PUBLIC  _main
; Function compile flags: /Ogtp
;   COMDAT _main
_TEXT   SEGMENT
_main   PROC                        ; COMDAT

; 5    :    printf("Hello world\n");

    push    OFFSET ??_C@_0N@NLPDAPMJ@Hello?5world?6?$AA@
    call    DWORD PTR __imp__printf
    add esp, 4

; 6    :    return 0;

    xor eax, eax

; 7    : }

    ret 0
_main   ENDP
_TEXT   ENDS
END

OpenMP是一组编译器指令(我没有使用),库例程(我没有链接到),以及一些环境变量(再次,未使用)。因此,没有理由输出程序会有任何不同。即使包括omp.h也不会改变任何内容(注释行除外)。