Sun Studio 12:C 用户指南

3.3.1.1 SUNW_MP_THR_IDLE

目前,程序的起始线程创建绑定线程。绑定线程一旦创建,将会参与执行程序的并行部分(并行循环、并行区域等),并在程序的串行部分运行时保持旋转等待状态。在程序终止之前,这些绑定线程不会休眠或停止。并行化程序在专用系统上运行时,使这些线程保持旋转等待状态通常可达到最佳性能。不过,保持旋转等待的线程会占用系统资源。

使用 SUNW_MP_THR_IDLE 环境变量控制每个线程在完成其一份并行作业后的状态。


% setenv SUNW_MP_THR_IDLE value

您可以用 spinsleep[n s|n ms] 替换 value。缺省值为 spin,表示线程在完成一份并行任务之后应保持旋转(或忙等待)状态,直到新的一份并行任务到来为止。

另一个选项 sleep[n s|n ms] 在旋转等待 n 个单位时间后使线程进入休眠状态。等待单位可以是秒(s,为缺省单位)或毫秒 (ms),其中 1s 表示 1 秒;10ms 表示 10 毫秒。不带参数的 sleep 在线程完成并行任务后使线程立即进入休眠状态。sleepsleep0sleep0ssleep0ms 均等效。

如果新作业在达到 n 个单位时间之前到达,线程将停止旋转等待并开始执行新作业。如果 SUNW_MP_THR_IDLE 包含非法值或未设置值,那么 spin 用作缺省值。

SUNW_MP_WARN

此环境变量设置为 TRUE,可打印来自 OpenMP 和其他并行化运行时系统的警告消息。


% setenv SUNW_MP_WARN TRUE

如果通过使用 sunw_mp_register_warn() 注册某个函数来处理警告消息,那么即使将 SUNW_MP_WARN 设置为 TRUE,它也不会打印警告消息。如果未注册函数,但已将 SUNW_MP_WARN 设置为 TRUESUNW_MP_WARN 会将警告消息打印至 stderr。如果您未注册函数且未设置 SUNW_MP_WARN,则不会发出警告消息。有关 sunw_mp_register_warn() 的更多信息,请参见3.2.1 处理 OpenMP 运行时警告

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

对于某些已并行的代码,可能需要将线程栈大小设置为比缺省值大的值。

有时,编译器会生成一条警告消息,指出需要更大的栈大小。然而,除了通过尝试并出错之外,不可能知道应设置多大的栈大小正合适,尤其是涉及私有/局部数组时。如果栈太小导致线程无法运行,程序将异常终止并出现段故障。