我使用Visual Studio 2012在c ++中工作。我想知道以下这些案例之间的区别,
我已经通过启用openmp构建了我的应用程序,但我没有进行并行编程。我的意思是我没有在我的任何代码中使用#pragma等。
我通过禁用openmp构建了我的应用程序,但我没有进行任何并行编程。
在这种情况下,可能出现什么样的变化或问题,例如应用程序大小等。
答案 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
也不会改变任何内容(注释行除外)。