跳过导航链接 | |
退出打印视图 | |
![]() |
Oracle Solaris Studio 12.3:C 用户指南 Oracle Solaris Studio 12.3 Information Library (简体中文) |
C 编译器本身接受 OpenMP API,用于共享内存并行化。API 包括一组并行化 pragma。从 OpenMP Web 站点 http://www.openmp.org 中可获得有关 OpenMP API 规范的信息。
要启用编译器的 OpenMP 支持以及对 OpenMP pragma 的识别,请使用 -xopenmp 选项进行编译。如果没有 -xopenmp 选项,编译器会将 OpenMP pragma 视为注释。请参见B.2.131 -xopenmp[= i]。
有关详细信息,请参见《Oracle Solaris Studio OpenMP API 用户指南》。
OpenMP 运行时系统可针对非致命错误发出警告。使用以下函数注册一个回调函数以处理这些警告:
int sunw_mp_register_warn(void (*func) (void *) )
您可以通过对 <sunw_mp_misc.h> 发出 #include 预处理程序指令来访问该函数的原型。
如果不想注册函数,请将环境变量 SUNW_MP_WARN 设置为 TRUE,以向 stderr 发送警告消息。
有关特定于 OpenMP 的此实现的信息(包括与 OpenMP 相关的 pragma、环境变量和运行时函数),请参见《Oracle Solaris Studio OpenMP API 用户指南》。
下面是与并行化 C 相关的一些环境变量。还存在由 OpenMP API 规范定义的其他环境变量以及特定于 Oracle Solaris Studio 实现的其他环境变量。有关与并行化相关的所有环境变量的说明,请参见《Oracle Solaris Studio OpenMP API 用户指南》。
PARALLEL 或 OMP_NUM_THREADS
如果可以利用多处理器执行,请设置 PARALLEL 环境变量。PARALLEL 环境变量指定可供程序使用的处理器数。如果未指定,则使用缺省值 2。
如果目标机器具有多个处理器,线程可以映射到独立的处理器。运行该程序将导致创建执行程序的并行化部分的两个线程。
可以使用 PARALLEL 或 OMP_NUM_THREADS ,它们是等效的。
SUNW_MP_THR_IDLE
控制 OpenMP 程序中空闲线程的状态,这些线程正在边界处等待或者正在等待要处理的新并行区域。有关详细信息,请参见《Oracle Solaris Studio OpenMP API 用户指南》。
SUNW_MP_WARN
将此环境变量设置为 TRUE,可输出来自 OpenMP 和其他并行化运行时系统的警告消息。有关详细信息,请参见《Oracle Solaris Studio OpenMP API 用户指南》。
STACKSIZE
正在执行的程序会为主线程保留一个主内存堆栈,同时为每个从属线程保留不同的堆栈。堆栈是临时内存地址空间,用来存储子程序调用中的参数和自动变量。
主堆栈的缺省大小约为 8 兆字节。使用 limit 命令显示当前主堆栈大小并对其进行设置。
% limit cputime unlimited filesize unlimited datasize 2097148 kbytes stacksize 8192 kbytes <- current main stack size coredumpsize 0 kbytes descriptors 256 memorysize unlimited % limit stacksize 65536 <- set main stack to 64Mb
多线程程序的每个从属线程均具有其自身的线程堆栈。该堆栈与主线程的主堆栈相似,但对该线程是唯一的。线程的私有数组和变量(对于线程是局部的)在线程堆栈中进行分配。
所有从属线程的堆栈大小都相同,缺省情况下,对于 32 位应用程序为 4MB,对于 64 位应用程序为 8MB。可以用环境变量 STACKSIZE 来设置该大小:
% setenv STACKSIZE 16483 <- Set thread stack size to 16 Mb
对于某些已并行的代码,可能需要将线程堆栈大小设置为比缺省值大的值。
有时,编译器会生成一条警告消息,指出需要更大的堆栈大小。确定要设置的栈大小通常通过尝试和错误来完成,特别是在涉及私有/本地数组的情况下。如果堆栈大小对于要运行的线程太小,程序将会由于段故障而退出。
STACKSIZE 环境变量的设置对使用 Oracle Solaris pthreads API 的程序没有效果。
关键字 restrict 可以与并行化 C 一起使用。正确使用关键字 restrict 有助于编译器对确定代码序列是否可并行化需要的数据别名进行求值。有关详细信息,请参阅D.1.2 C99 关键字。