JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris Studio 12.2:C 用户指南
search filter icon
search icon

文档信息

前言

1.  C 编译器介绍

2.  特定于 C 编译器实现的信息

3.  并行化 C 代码

3.1 概述

3.1.1 使用示例

3.2 OpenMP 并行化

3.2.1 处理 OpenMP 运行时警告

3.3 环境变量

3.3.1 PARALLELOMP_NUM_THREADS

3.3.2 SUNW_MP_THR_IDLE

3.3.3 SUNW_MP_WARN

3.3.4 STACKSIZE

3.3.5 在并行代码中使用 restrict

3.4 数据依赖性和干扰

3.4.1 并行执行模型

3.4.2 私有标量和私有数组

3.4.3 返回存储

3.4.4 约简变量

3.5 加速

3.5.1 Amdahl 定律

3.5.1.1 开销

3.5.1.2 Gustafson 定律

3.6 负载平衡和循环调度

3.6.1 静态调度或块调度

3.6.2 自我调度

3.6.3 引导自我调度

3.7 循环变换

3.7.1 循环分布

3.7.2 循环合并

3.7.3 循环交换

3.8 别名和并行化

3.8.1 数组引用和指针引用

3.8.2 限定指针

3.8.3 显式并行化和 Pragma

3.8.3.1 串行 Pragma

3.8.3.2 并行 Pragma

for 循环的嵌套

并行化的合格性

处理器数

变量分类

privateshared 变量的缺省作用域规则

private 变量

shared 变量

readonly 变量

storeback 变量

savelast

reduction 变量

调度控制

3.9 内存边界内部函数

4.  lint 源代码检验器

5.  基于类型的别名分析

6.  转换为 ISO C

7.  转换应用程序以适用于 64 位环境

8.  cscope:交互检查 C 程序

A.  按功能分组的编译器选项

B.  C 编译器选项参考

C.  实现定义的 ISO/IEC C99 行为

D.  支持的 C99 功能

E.  实现定义的 ISO/IEC C90 行为

F.  ISO C 数据表示法

G.  性能调节

H.  K&R Solaris Studio C 与 Solaris Studio ISO C 之间的差异

索引

3.3 环境变量

与并行化 C 相关的环境变量有四种:

3.3.1 PARALLELOMP_NUM_THREADS

如果可以利用多处理器执行,请设置 PARALLEL 环境变量。PARALLEL 环境变量指定可供程序使用的处理器数。在下例中,PARALLEL 设置为 2:

% setenv PARALLEL 2

如果目标机器具有多个处理器,线程可以映射到独立的处理器。运行该程序将导致创建执行程序的并行化部分的两个线程。

可以使用 PARALLELOMP_NUM_ HREADS,它们是等效的

3.3.2 SUNW_MP_THR_IDLE

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

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

% setenv SUNW_MP_THR_IDLE value

您可以用 spinsleep[n s|n ms] 替换 value。缺省值为 sleep,它在旋转等待 n 个单位后将线程置于休眠状态。等待单位可以是秒(s,为缺省单位)或毫秒 (ms),其中 1s 表示 1 秒;10ms 表示 10 毫秒。不带参数的 sleep 在线程完成并行任务后使线程立即进入休眠状态。sleepsleep0sleep0ssleep0ms 均等效。如果新作业在达到 n 个单位时间之前到达,线程将停止旋转等待并开始执行新作业。

另一个选项 spin 表示线程在完成一个并行任务之后应保持旋转(或忙等待)状态,直到一个新的并行任务到来为止。

如果 SUNW_MP_THR_IDLE 包含非法值或未设置,那么 spin 将用作缺省值。

3.3.3 SUNW_MP_WARN

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

% setenv SUNW_MP_WARN TRUE

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

3.3.4 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 环境变量的设置对使用 Solaris pthreads API 的程序没有效果。

3.3.5 在并行代码中使用 restrict

关键字 restrict 可以与并行化 C 配合使用。正确使用关键字 restrict 有助于优化器了解所需数据的别名,从而确定代码序列是否可以并行化。有关详细信息,请参阅D.1.2 C99 关键字