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.9 内存边界内部函数

编译器提供头文件 mbarrier.h,此头文件中针对 SPARC 和 x86 处理器定义了多种内存边界内部函数。这些内部函数可在开发者使用自己的同步基元编写多线程代码时使用。建议用户参阅自己的处理器文档,以确定特殊情况下需要使用这些内部函数的时间以及是否需要使用这些内部函数。

mbarrier.h 头文件支持内存排序内部函数:

内部函数 __compiler_barrier() 出现异常的所有边界内部函数生成内存排序指令,在 x86 上这些指令是 mfencesfencelfence 指令,而在 SPARC 平台上这些指令是 membar 指令。

__compiler_barrier() 内部函数不会生成指令,但会通知编译器所有以前的内存操作必须在启动任何后续内存操作之前完成。以上操作将导致以下实际结果:所有的非本地变量和带有 static 存储类说明符的本地变量将会在边界前返回存储在内存中,然后在边界后重新下载,并且在此过程中编译器不会将边界前的操作与边界后的操作弄混。所有其他的边界均隐含 __compiler_barrier() 内部函数的行为。

例如,在以下代码中 __compiler_barrier() 内部函数的存在将阻止编译器合并两种循环:

#include "mbarrier.h"
int thread_start[16];
void start_work()
{
/* Start all threads */
   for (int i=0; i<8; i++)
   {
     thread_start[i]=1;
   }
   __compiler_barrier();
/* Wait for all threads to complete */
   for (int i=0; i<8; i++)
   {
      while (thread_start[i]==1){}
   }
}