/openmp(启用 OpenMP 2.0 支持)
导致编译器处理 #pragmaomp。
/openmp
备注
#pragma omp 用于指定 OpenMP指令 和 OpenMP子句。如果未在编译中指定 /openmp,编译器将忽略 OpenMP 子句和指令。即使未指定 /openmp,OpenMP 函数调用也由编译器处理。
使用 /openmp 编译且使用 OpenMP库 的应用程序只能在 Windows 2000 或更高版本的操作系统上运行。
用 /openmp 和 /clr 编译的应用程序只能在单个应用程序域进程中运行;不支持多个应用程序域。也就是说,当运行模块构造函数 (.cctor) 时,它将检测用 /openmp 编译的进程以及应用程序是否正在加载到非默认运行时。有关更多信息,请参见appdomain、/clr(公共语言运行时编译)和混合程序集的初始化。
如果尝试将用 /openmp 和 /clr 编译的应用程序加载到非默认应用程序域,则调试器外将引发 TypeInitializationException 异常并且调试器内将引发 OpenMPWithMultipleAppdomainsException 异常。
在下列情形下,也可能引发这些异常:
如果用 /clr(而不是用 /openmp)编译的应用程序加载到非默认应用程序域,但是其中的进程包括用 /openmp 编译的应用程序。
如果将 /clr 应用程序传递给实用工具,例如 regasm.exe (Regasm.exe(程序集注册工具)),而该实用工具将其目标程序集加载到非默认应用程序域。
公共语言运行时的代码访问安全性在 OpenMP 区域中不起作用。如果在并行区域外部应用 CLR 代码访问安全性特性,它在并行区域内将无效。
Microsoft 建议您不要通过使用 AllowPartiallyTrustedCallersAttribute 或任何 CLR 代码访问安全性特性,编写允许部分信任的调用方的 /openmp 应用程序。
在 Visual Studio 开发环境中设置此编译器选项
打开项目的**“属性页”**对话框。有关详细信息,请参见如何:打开项目属性页。
展开**“配置属性”**节点。
展开**“C/C++”**节点。
选择**“语言”**属性页。
修改**“OpenMP 支持”**属性。
以编程方式设置此编译器选项
- 请参见 OpenMP。
示例
下面的示例显示 threadpool 启动与启动它之后使用 threadpool 的一些效果比较。假定 x64 单内核、双处理器 threadpool 花费大约 16 毫秒启动。在此之后,threadpool 将花费极少的时间。
当使用 /openmp 编译时,第二次调用 test2 所运行的时间决不会比用 /openmp- 编译时长,因为不需要 threadpool 启动。在进行一百万次迭代的情况下,/openmp 版本第二次调用 test2 的速度比 /openmp- 版本快;在进行 25 次迭代的情况下,/openmp- 和 /openmp 两个版本的注册时间都小于时钟间隔大小。
因此,如果应用程序中仅有一个循环并且它运行的时间少于 15 毫秒(根据计算机上的大致系统开销而有所不同),/openmp 可能不合适,但是如果它的时间多于 15 毫秒,则可能要考虑使用 /openmp。
// cpp_compiler_options_openmp.cpp
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
volatile DWORD dwStart;
volatile int global = 0;
double test2(int num_steps) {
int i;
global++;
double x, pi, sum = 0.0, step;
step = 1.0 / (double) num_steps;
#pragma omp parallel for reduction(+:sum) private(x)
for (i = 1; i <= num_steps; i++) {
x = (i - 0.5) * step;
sum = sum + 4.0 / (1.0 + x*x);
}
pi = step * sum;
return pi;
}
int main(int argc, char* argv[]) {
double d;
int n = 1000000;
if (argc > 1)
n = atoi(argv[1]);
dwStart = GetTickCount();
d = test2(n);
printf_s("For %d steps, pi = %.15f, %d milliseconds\n", n, d, GetTickCount() - dwStart);
dwStart = GetTickCount();
d = test2(n);
printf_s("For %d steps, pi = %.15f, %d milliseconds\n", n, d, GetTickCount() - dwStart);
}