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.6 负载平衡和循环调度

循环调度是将并行循环的迭代分布到多个线程的进程。为获得最大加速,在线程间均匀地分布工作而不产生太大开销十分重要。编译器针对不同情况提供多种调度类型。

3.6.1 静态调度或块调度

当循环的不同迭代执行的工作相同时,将工作均匀地分摊在系统上不同的线程之间很有益。此方法称为静态调度。

示例 3-13 静态调度的良好循环

for (i=1; i < 1000; i++) {
    sum += a[i]*b[i];       /* S1 */
}

在静态调度或块调度中,每个线程将获取相同次数的迭代。如果有 4 个线程,则在以上示例中,每个线程将获取 250 次迭代。假设不存在中断,并且每个线程的进度相同,则所有线程将同时完成。

3.6.2 自我调度

一般说来,当每次迭代执行的工作不同时,静态调度不会达到良好的负载平衡。在静态调度中,每个线程获取同一迭代块。除主线程之外,每个线程在完成自己的块时,将等待参与下一个并行循环的执行。主线程将继续执行程序。在自我调度中,每个线程获取不同的小迭代块,并且在完成为其分配的块之后,尝试从同一循环中获取更多块。

3.6.3 引导自我调度

在引导自我调度 (guided self scheduling, GSS) 中,每个线程获取连续变少的块。如果每次迭代的大小不同,GSS 有助于平衡负载。