当前位置:文档之家› OpenMP API 用户指南

OpenMP API 用户指南

OpenMP API 用户指南
OpenMP API 用户指南

Sun Studio12Update

1:OpenMP API用户指南

Sun Microsystems,Inc.

4150Network Circle

Santa Clara,CA95054

U.S.A.

文件号码821–0393

2009年9月

版权所有2009Sun Microsystems,Inc.4150Network Circle,Santa Clara,CA95054U.S.A.保留所有权利。

对于本文档中介绍的产品,Sun Microsystems,Inc.对其所涉及的技术拥有相关的知识产权。需特别指出的是(但不局限于此),这些知识产权可能包含一项或多项美国专利,以及在美国和其他国家/地区申请的待批专利。

美国政府权利-商业软件。政府用户应遵循Sun Microsystems,Inc.的标准许可协议,以及FAR(Federal Acquisition Regulations,即“联邦政府采购法规”)的适用条款及其补充条款。

本发行版可能包含由第三方开发的内容。

本产品的某些部分可能是从Berkeley BSD系统衍生出来的,并获得了加利福尼亚大学的许可。UNIX是X/Open Company,Ltd.在美国和其他国家/地区独家许可的注册商标。

Sun、Sun Microsystems、Sun徽标、Solaris徽标、Java咖啡杯徽标、https://www.doczj.com/doc/456213298.html,、Java和Solaris是Sun Microsystems,Inc.在美国和其他国家/地区的商标或注册商标。所有SPARC商标的使用均已获得许可,它们是SPARC International,Inc.在美国和其他国家/地区的商标或注册商标。标有SPARC商标的产品均基于由Sun Microsystems,Inc.开发的体系结构。

OPEN LOOK和Sun TM图形用户界面是Sun Microsystems,Inc.为其用户和许可证持有者开发的。Sun感谢Xerox在研究和开发可视或图形用户界面的概念方面为计算机行业所做的开拓性贡献。Sun已从Xerox获得了对Xerox图形用户界面的非独占性许可证,该许可证还适用于实现OPEN LOOK GUI 和在其他方面遵守Sun书面许可协议的Sun许可证持有者。

本出版物所介绍的产品以及所包含的信息受美国出口控制法制约,并应遵守其他国家/地区的进出口法律。严禁将本产品直接或间接地用于核设

施、导弹、生化武器或海上核设施,也不能直接或间接地出口给核设施、导弹、生化武器或海上核设施的最终用户。严禁出口或转口到美国禁运的国家/地区以及美国禁止出口清单中所包含的实体,包括但不限于被禁止的个人以及特别指定的国家/地区的公民。

本文档按“原样”提供,对于所有明示或默示的条件、陈述和担保,包括对适销性、适用性或非侵权性的默示保证,均不承担任何责任,除非此免责声明的适用范围在法律上无效。

090904@22749

目录

前言 (7)

1OpenMP API简介 (11)

1.1哪里有OpenMP规范 (11)

1.2本章所使用的特殊惯例 (11)

2编译并运行OpenMP程序 (13)

2.1要使用的编译器选项 (13)

2.2OpenMP环境变量 (15)

2.3处理器绑定 (18)

2.4栈和栈大小 (21)

2.5使用线程分析器检查OpenMP程序 (22)

3实现定义的行为 (23)

3.1任务调度点 (23)

3.2内存模型 (23)

3.3内部控制变量 (24)

3.4线程的动态调整 (24)

3.5循环指令 (24)

3.6构造 (25)

3.6.1SECTIONS (25)

3.6.2SINGLE (25)

3.6.3ATOMIC (25)

3.7例程 (25)

3.7.1omp_set_schedule (25)

3.7.2omp_set_max_active_levels (25)

3.7.3omp_get_max_active_levels (25)

3

目录

3.8环境变量 (26)

3.9Fortran问题 (27)

3.9.1THREADPRIVATE指令 (27)

3.9.2SHARED子句 (27)

3.9.3运行时库定义 (27)

4嵌套并行操作 (29)

4.1执行模型 (29)

4.2控制嵌套并行操作 (29)

4.2.1OMP_NESTED (29)

4.2.2SUNW_MP_MAX_POOL_THREADS (31)

4.2.3SUNW_MP_MAX_NESTED_LEVELS (31)

4.3在嵌套并行区域中使用OpenMP库例程 (33)

4.4有关使用嵌套并行操作的一些提示 (35)

5任务处理 (37)

5.1任务处理模型 (37)

5.2数据环境 (38)

5.3TASKWAIT指令 (39)

5.4任务处理示例 (39)

5.5编程注意事项 (40)

5.5.1THREADPRIVATE和线程特定的信息 (40)

5.5.2锁 (41)

5.5.3对栈数据的引用 (41)

5.5.4数据作用域属性 (45)

6自动确定变量的作用域 (47)

6.1自动作用域数据范围子句 (47)

6.1.1__auto子句 (47)

6.1.2default(__auto)子句 (48)

6.2作用域规则 (48)

6.2.1标量变量的作用域规则 (48)

6.2.2数组的作用域规则 (48)

6.3关于自动作用域的通用注释 (49)

4

Sun Studio12Update1:OpenMP API用户指南?2009年9月

目录

6.3.1Fortran95的自动确定作用域规则: (49)

6.3.2C/C++的自动确定作用域规则: (49)

6.4检查自动作用域的结果 (50)

6.5当前实现的已知限制 (53)

7性能注意事项 (55)

7.1一般性建议 (55)

7.2伪共享及其避免方法 (58)

7.2.1什么是伪共享? (58)

7.2.2减少伪共享 (59)

7.3Solaris OS调优特性 (59)

A子句在指令中的放置 (61)

B转换为OpenMP (63)

B.1转换传统Fortran指令 (63)

B.1.1转换Sun风格的Fortran指令 (63)

B.1.2转换Cray风格的Fortran指令 (65)

B.2转换传统C Pragma (66)

B.2.1传统C Pragma与OpenMP间的问题 (67)

索引 (69)

5

6

前言

OpenMP API用户指南概述了用于生成多重处理应用程序的OpenMP Fortran95、C和

C++应用程序接口(application program interface,API)。Sun Studio编译器支持OpenMP

API。本指南专供具有Fortran、C或C++语言及OpenMP并行编程模型工作经验的科

学工作者、工程技术人员和程序员使用。通常,还假定他们熟悉Solaris操作环境或

UNIX。

印刷约定

下表介绍了本书中的印刷约定。

表P–1印刷约定

字体或符号含义示例

AaBbCc123命令、文件和目录的名称;计算机屏幕输出编辑.login文件。

使用ls-a列出所有文件。

machine_name%you have mail.

AaBbCc123用户键入的内容,与计算机屏幕输出的显示

不同machine_name%su Password:

aabbcc123要使用实名或值替换的命令行占位符删除文件的命令为rm filename。AaBbCc123保留未译的新词或术语以及要强调的词这些称为Class选项。

注意:有些强调的项目在联机时

以粗体显示。

新词术语强调新词或术语以及要强调的词高速缓存是存储在本地的副本。

请勿保存文件。

《书名》书名阅读《用户指南》的第6章。

7

前言

命令中的shell提示符示例

下表列出了C shell、Bourne shell和Korn shell的缺省UNIX?系统提示符和超级用户提示

符。

表P–2shell提示符

shell提示符

C shell提示符machine_name%

C shell超级用户提示符machine_name#

Bourne shell和Korn shell提示符$

Bourne shell和Korn shell超级用户提示符#

受支持的平台

此Sun TM Studio发行版支持使用SPARC?和x86系列处理器体系结构的系统:

UltraSPARC?、SPARC64、AMD64、Pentium和Xeon EM64T。可从以下位置获得硬件兼

容性列表,在列表中可以查看您正在使用的Solaris操作系统版本所支持的系

统:https://www.doczj.com/doc/456213298.html,/bigadmin/hcl。这些文档中给出了平台类型间所有实现的区

别。

在本文档中,与x86相关的术语的含义如下:

■"x86"泛指64位和32位的x86兼容产品系列。

■''x64"指出了有关AMD64或EM64T系统的特定64位信息。

■“32位x86”指出了有关基于x86的系统的特定32位信息。

有关受支持的系统,请参阅硬件兼容性列表。

访问Sun Studio文档

可以访问以下位置的文档:

■可以从位于https://www.doczj.com/doc/456213298.html,/sunstudio/documentation的文档索引页中获取文档。

■IDE所有组件的联机帮助可通过IDE中的“帮助”菜单以及许多窗口和对话框上的“帮助”按钮获取。

■性能分析器的联机帮助可通过性能分析器中的“帮助”菜单以及许多窗口和对话框上的“帮助”按钮获取。

可以通过Internet访问https://www.doczj.com/doc/456213298.html, Web站点(https://www.doczj.com/doc/456213298.html,)阅读、打印和购

买Sun Microsystems的各种手册。

8

Sun Studio12Update1:OpenMP API用户指南?2009年9月

前言

注–Sun对本文档中提到的第三方Web站点的可用性不承担任何责任。对于此类站点或

资源中的(或通过它们获得的)任何内容、广告、产品或其他资料,Sun并不表示认

可,也不承担任何责任。对于因使用或依靠此类站点或资源中的(或通过它们获得

的)任何内容、产品或服务而造成的或连带产生的实际或名义损坏或损失,Sun概不负

责,也不承担任何责任。

采用易读格式的文档

该文档以易读格式提供,以方便残障用户使用辅助技术进行阅读。可以按照下表所述

找到文档的易读版本。

文档类型易读版本的格式和位置

手册HTML,位于https://www.doczj.com/doc/456213298.html,

自述文件HTML,位于开发者门户网站

https://www.doczj.com/doc/456213298.html,/sunstudio/documentation/ss12u1/手册页HTML,位于开发者门户网站

https://www.doczj.com/doc/456213298.html,/sunstudio/documentation/ss12u1/联机帮助HTML,可通过IDE中的“帮助”菜单和“帮助”按钮获取

发行说明HTML,位于https://www.doczj.com/doc/456213298.html,

开发者资源

访问https://www.doczj.com/doc/456213298.html,/sunstudio查看下列经常更新的资源:

■有关编程技术和最佳做法的文章

■软件文档以及随软件一起安装的文档的更正信息

■指导您使用Sun Studio工具逐步完成开发任务的教程

■有关支持级别的信息

■用户论坛

■可下载的代码示例

■新技术预览

Sun Studio门户是Sun Developer Network Web站点(https://www.doczj.com/doc/456213298.html,)上面向

开发者的众多其他资源之一。

9

前言

联系技术支持

如果您遇到通过本文档无法解决的技术问题,请访问以下网址:https://www.doczj.com/doc/456213298.html,/

service/contacting

Sun欢迎您提出意见

Sun致力于提高其文档的质量,并十分乐意收到您的意见和建议。您可以通过以下

URL向Sun提交您的意见:https://www.doczj.com/doc/456213298.html,/hwdocs/feedback。

请在电子邮件的主题行中注明文档的文件号码。例如,本文档的文件号码是

821-0393-10。

10

Sun Studio12Update1:OpenMP API用户指南?2009年9月

1第1章

OpenMP API简介

OpenMP TM应用程序接口是适用于共享内存多线程体系结构的可移植并行编程模型,它

是由本公司与多家计算机供应商联合开发的。其规范由“OpenMP体系结构审核委员

会”创立并公布。

OpenMP API是Solaris TM操作系统平台上所有Sun Studio编译器的推荐并行编程模

型。请参见附录以了解有关将传统Fortran和C并行化指令转换为OpenMP的指导。1.1哪里有OpenMP规范

本手册提供的材料描述了OpenMP API的Sun Studio实现所特有的问题。有关完整的详

细信息,请参阅OpenMP规范文档。

本手册直接引用了OpenMP3.0API规范中的某些部分。

可在官方OpenMP Web站点https://www.doczj.com/doc/456213298.html,中找到C、C++和Fortran95的

OpenMP3.0规范。

有关OpenMP的其他信息(包括教程和其他开发者资源),请访问COMPunity Web站

点https://www.doczj.com/doc/456213298.html,。

有关Sun Studio编译器发行版及其OpenMP API实现的最新信息,请访问Sun Developer

Network门户网站https://www.doczj.com/doc/456213298.html,/sunstudio。

1.2本章所使用的特殊惯例

在以下表格和示例中,Fortran指令和源代码虽以大写形式出现,但实际上不区分大小

写。

术语结构化块是指无数据输入或输出的Fortran或C/C++语句块。

方括号[...]中的构造是可选的。

11

1.2本章所使用的特殊惯例

在本手册中,"Fortran"是指Fortran95语言和编译器f95。

在本手册中,术语“指令”和"pragma"互换使用。

12

Sun Studio12Update1:OpenMP API用户指南?2009年9月

2第2章

编译并运行OpenMP程序

本章介绍编译器和运行时选项,这些选项会影响使用OpenMP API的程序。

要在多线程环境下运行并行化的程序,必须将程序可能使用的线程数设置为大于

一。这可以通过在运行程序前设置OMP_SET_NUM_THREADS环境变量来实现。也可以通过

以下方式设置线程数:在运行程序的过程中调用值大于一的omp_set_num_threads()函

数,或者将num_threads子句与PARALLEL指令一起使用。

有关Sun Studio编译器和OpenMP的最新信息,请访问Sun Developer Network门户网

站:https://www.doczj.com/doc/456213298.html,/sunstudio

2.1要使用的编译器选项

要使用OpenMP指令实现显式并行化,请使用cc、CC或f95选项标志-xopenmp编译程

序。此标志可带有可选关键字参数。(f95编译器将-xopenmp和-openmp作为同义词接

受。)

-xopenmp标志接受下列关键字子选项。

-xopenmp=parallel启用OpenMP pragma的识别。

-xopenmp=parallel的最低优化级别是-xO3。

如有必要,编译器将优化级别从较低级别更改为-xO3,并发出警

告。

13

2.1要使用的编译器选项

-xopenmp=noopt启用OpenMP pragma的识别。

如果优化级别低于-xO3,则编译器不提升它。

如果将优化级别显式设置为低于-xO3的级别,如-xO2

-openmp=noopt,则编译器会报告错误。

如果没有使用-openmp=noopt指定优化级别,则会识别OpenMP

pragma,并相应地并行化程序,但不执行优化。

-xopenmp=stubs不再支持此选项。

OpenMP桩模块库是为方便用户而提供的。

要编译调用OpenMP库例程的OpenMP程序但忽略其OpenMP

pragma,请在编译该程序时不要使用-xopenmp选项,并且将目标文

件与libompstubs.a库链接。

例如,%cc omp_ignore.c-lompstubs

不支持同时与libompstubs.a和OpenMP运行时库libmtsk.so进行

链接,因为这样可能会导致意外的行为。

-xopenmp=none禁用对OpenMP pragma的识别,并且不更改优化级别。

附加说明:

■如果未在命令行中指定—xopenmp,则编译器会假定使用—xopenmp=none(禁用对OpenMP pragma的识别)。

■如果指定了—xopenmp但不带关键字子选项,则编译器会假定使用

—xopenmp=parallel。

■指定-xopenmp=parallel或noopt时,会将_OPENMP预处理程序标记定义为

YYYYMM(具体地讲,对于C/C++,将其定义为200805L;对于Fortran95,将其定

义为200805)。

■使用dbx调试OpenMP程序时,请使用-xopenmp=noopt-g进行编译。

■-xopenmp的缺省优化级别在以后的发行版中可能会更改。通过显式指定适当的优化级别,可避免出现编译警告消息。

■对于Fortran95,-xopenmp、-xopenmp=parallel、-xopenmp=noopt会自动添加

-stackvar。

■在分步编译并链接OpenMP程序时,请在各个编译及链接步骤中包含-xopenmp。

■使用C/C++的-xvpara选项或Fortran95的—vpara选项可显示编译器并行化消息。

■为了在Solaris平台上获得最佳性能和功能,请确保正在运行的系统上已安装了最新的OpenMP运行时库l ibmtsk.so。

14

Sun Studio12Update1:OpenMP API用户指南?2009年9月

2.2OpenMP环境变量2.2OpenMP环境变量

OpenMP规范定义了四个用于控制OpenMP程序执行的环境变量。下表对它们进行了

概括。有关详细信息,请参阅https://www.doczj.com/doc/456213298.html,中的OpenMP API版本3.0规范。

表2–1OpenMP环境变量

环境变量功能

OMP_SCHEDULE为指定了RUNTIME调度类型的DO、PARALLEL DO、for、parallel for

指令/pragma设置调度类型。

如果未定义,则使用缺省值STATIC。值为"type[,chunk]"

示例:setenv OMP_SCHEDULE’GUIDED,4’

OMP_NUM_THREADS设置在执行并行区域期间所要使用的线程数。

使用NUM_THREADS子句或调用OMP_SET_NUM_THREADS()可以覆盖此

值。

如果未设置,则使用缺省值1。value是一个正整数。

示例:setenv OMP_NUM_THREADS16

OMP_DYNAMIC启用或禁用可用于执行并行区域的线程数的动态调整。

如果未设置,则使用缺省值TRUE。值为TRUE或FALSE。

示例:setenv OMP_DYNAMIC FALSE

OMP_NESTED启用或禁用嵌套并行操作。

值为TRUE或FALSE。

缺省值为FALSE。

示例:setenv OMP_NESTED FALSE

OMP_STACKSIZE为OpenMP创建的线程设置栈大小。

可以将大小指定为以千字节为单位的正整数,或者带有后缀

B、K、M或G,分别表示字节、千字节、兆字节或千兆字节。

示例:setenv OMP_STACKSIZE10M

OMP_WAIT_POLICY设置有关等待线程的所需策略ACTIVE或PASSIVE。

ACTIVE线程在等待时会占用处理器时间。PASSIVE线程不会占用处

理器时间,并且可能会放弃处理器或进入休眠状态。

OMP_MAX_ACTIVE_LEVELS将嵌套活动并行区域的最大级别数设置为非负整数值。

OMP_THREAD_LIMIT将要在整个OpenMP程序中使用的线程数设置为正整数。

第2章?编译并运行OpenMP程序15

2.2OpenMP环境变量

其他多重处理环境变量也会影响OpenMP程序的执行,但它们不是OpenMP规范的一

部分。下表对它们进行了概括。

表2–2多重处理环境变量

环境变量功能

PARALLEL为与传统程序兼容,设置PARALLEL环境变量的效果与设置OMP_NUM_THREADS

的效果相同。然而,如果同时设置PARALLEL和OMP_NUM_THREADS,则必须将

它们设置为相同的值。

SUNW_MP_WARN控制OpenMP运行时库发出的警告消息。如果设置为TRUE,运行时库会给

stderr发出警告消息;如果设置为FALSE,则禁用警告消息。缺省值为

FALSE。

OpenMP运行时库能够检查很多常见的OpenMP违规行为,如错误的嵌套

和死锁。运行时检查会增加程序执行的开销。请参见第3章,实现定义的

行为。

如果SUNW_MP_WARN设置为TRUE,则运行时库会向stderr发出警告消息。如

果程序注册一个回调函数以接受警告消息,则运行时库也将发出警告消

息。程序可通过调用以下函数来注册用户回调函数:

int sunw_mp_register_warn(void(*func)(void*));

回调函数的地址将作为参数传递给sunw_mp_register_warn()。如果成功注

册了回调函数,该函数将返回0,如果注册失败则返回1。

如果程序已注册了回调函数,libmtsk将调用该注册的函数,将一个指针传

递给包含错误消息的本地化字符串。从回调函数返回后,指向的内存将不

再有效。

示例:

setenv SUNW_MP_WARN TRUE

16

Sun Studio12Update1:OpenMP API用户指南?2009年9月

2.2OpenMP环境变量表2–2多重处理环境变量(续)

环境变量功能

SUNW_MP_THR_IDLE控制OpenMP程序中空闲线程的状态,这些空闲线程正在某个屏障处等待

或者正在等待要处理的新并行区域。可以将该值设置为下列某个

值:SPIN、SLEEP、SLEEP(time s)、SLEEP(time ms)、SLEEP(time mc),其中

time是一个整数,指定时间量,s、ms和mc指定时间单位(分别为秒、毫

秒和微秒)。

SPIN指定空闲线程在屏障处等待时或等待要处理的新并行区域时应旋

转。不带时间参数的SLEEP指定空闲线程应立即休眠。带时间参数的SLEEP

指定线程进入休眠状态前应旋转等待的时间量。

缺省情况下,空闲线程经过一段时间的旋转等待后将进入休眠状

态。SLEEP、SLEEP(0)、SLEEP(0s)、SLEEP(0ms)和SLEEP(0mc)都是等效的。

请注意,如果同时设置SUNW_MP_THR_IDLE和OMP_WAIT_POLICY,它们的值必

须一致。

示例:

setenv SUNW_MP_THR_IDLE SPIN

setenv SUNW_MP_THR_IDLE SLEEP

setenv SUNW_MP_THR_IDLE SLEEP(2s)

setenv SUNW_MP_THR_IDLE SLEEP(20ms)

setenv SUNW_MP_THR_IDLE SLEEP(150mc)

SUNW_MP_PROCBIND此环境变量可在Solaris和Linux系统上工作。SUNW_MP_PROCBIND环境变量可

用于将OpenMP程序的线程绑定到正在运行的系统上的虚拟处理器。虽然

可以通过处理器绑定来增强性能,但是如果将多个线程绑定到同一虚拟处

理器,则会导致性能下降。有关详细信息,请参见第18页中的“2.3处理器

绑定”。

SUNW_MP_MAX_POOL_THREADS指定线程池的最大大小。线程池只包含OpenMP运行时库创建的非用户线

程。它不包含主线程或由用户程序显式创建的任何线程。如果将此环境变

量设置为零,则线程池为空,并且将由一个线程执行所有并行区域。如果

未指定,则使用缺省值1023。有关详细信息,请参见第29页中的“4.2控制

嵌套并行操作”。

请注意,SUNW_MP_MAX_POOL_THREADS指定用于整个程序的非用户OpenMP线

程的最大数量,而OMP_THREAD_LIMIT指定用于整个程序的用户和非用户

OpenMP线程的最大数量。如果同时设置SUNW_MP_MAX_POOL_THREADS和

OMP_THREAD_LIMIT,则它们的值必须一致,以便将OMP_THREAD_LIMIT设置为

比SUNW_MP_MAX_POOL_THREADS的值大一。

SUNW_MP_MAX_NESTED_LEVELS指定活动嵌套并行区域的最大深度。活动嵌套深度大于此环境变量值的任

何并行区域将只由一个线程来执行。如果并行区域是OpenMP并行区

域(其IF子句的值为false),则不会将该区域视为活动区域。如果未指

定,则使用缺省值4。有关详细信息,请参见第29页中的“4.2控制嵌套并

行操作”。

请注意,如果同时设置SUNW_MP_MAX_NESTED_LEVELS和

OMP_MAX_ACTIVE_LEVELS,则必须将它们设置为相同的值。

第2章?编译并运行OpenMP程序17

2.3处理器绑定

表2–2多重处理环境变量(续)

环境变量功能

STACKSIZE设置每个线程的栈大小。值以千字节为单位。缺省线程栈大小在32位

SPARC V8和x86平台上为4Mb,在64位SPARC V9和x86平台上为8Mb。

示例:

setenv STACKSIZE8192将线程栈大小设置为8Mb

STACKSIZE环境变量还接受带有B(字节)、K(千字节)、M(兆字节)或

G(千兆字节)后缀的数值。缺省单位为千字节。

请注意,如果同时设置STACKSIZE和OMP_STACKSIZE,则必须将它们设置为

相同的值。

SUNW_MP_GUIDED_WEIGHT设置加权因子,该因子用于确定在使用GUIDED调度的循环中为线程分配的

块的大小。该值应该是正浮点数,并且应用于程序中所有使用GUIDED调度

的循环。如果未设置,则采用缺省值2.0。

2.3处理器绑定

通过处理器绑定,程序员可指示操作系统在整个程序执行期间在同一处理器上运行该

程序中的线程。(在Linux上不提供此功能。)

在将处理器绑定与静态调度一起使用时,将有益于展示某个数据重用模式的应用程

序,在该模式中,由并行区域或工作共享区域中的线程访问的数据将位于上次调用的

并行区域或工作共享区域的本地缓存中。

从硬件的角度看,计算机系统是由一个或多个物理处理器组成的。从操作系统的角度

看,其中每个物理处理器都映射到可运行程序中的线程的一个或多个虚拟处理器。如

果n个虚拟处理器可用,则可同时调度运行n个线程。根据系统的不同,虚拟处理器可

能是处理器、内核,等等。

例如,每个UltraSPARC IV物理处理器都具有两个内核;从Solaris OS的角度看,其中

每个内核都是一个虚拟处理器,可以在其中安排要运行的线程。另一方

面,UltraSPARC T1物理处理器具有八个内核,每个内核可运行四个同时进行处理的线

程;从Solaris OS的角度看,共有32个虚拟处理器,可以在其中安排要运行的线程。在

Solaris操作系统上,可以使用psrinfo(1M)命令来确定虚拟处理器的数量。在Linux系

统上,文件/proc/cpuinfo提供有关可用处理器的信息。

当操作系统将线程绑定到处理器时,实际上是将线程绑定到特定的虚拟处理器而不是

物理处理器。

设置SUNW_MP_PROCBIND环境变量,可以将OpenMP程序中的线程绑定到特定的虚拟处

理器。为SUNW_MP_PROCBIND指定的值可以是下列值之一:

■字符串"TRUE"或"FALSE"(或小写的"true"或"false")。

例如,

%setenv SUNW_MP_PROCBIND"false"

18

Sun Studio12Update1:OpenMP API用户指南?2009年9月

2.3处理器绑定

■非负整数。

例如,%setenv SUNW_MP_PROCBIND"2"

■由一个或多个空格分隔的两个或更多非负整数的列表。

例如,%setenv SUNW_MP_PROCBIND"0246"

■两个非负整数n1和n2,二者之间由减号("-")分隔;n1必须小于或等于n2。

例如,%setenv SUNW_MP_PROCBIND"0-6"

请注意,上文提到的非负整数表示逻辑标识符(ID)。逻辑ID可能不同于虚拟处理器ID。下面将介绍二者之间的差异。

虚拟处理器ID:

系统中的每个虚拟处理器都有唯一的处理器ID。可以使用Solaris操作系统的

psrinfo(1M)命令显示有关系统中处理器的信息,包括其处理器ID。此外,还可以使用prtdiag(1M)命令显示系统配置和诊断信息。

可以使用psrinfo-pv列出系统中的所有物理处理器以及与每个物理处理器关联的虚拟处理器。

虚拟处理器ID可能是连续的,也可能是不连续的。例如,在具有8个UltraSPARC IV 处理器(16个内核)的Sun Fire4810上,虚拟处理器ID可能是:

0、1、2、3、8、9、10、11、512、513、514、515、520、521、522、523。

逻辑ID:

如上所述,为SUNW_MP_PROCBIND指定的非负整数是逻辑ID。逻辑ID是从0开始的连续整数。如果系统中可用的虚拟处理器数为n,则其逻辑ID为0、1、...、n-1(按psrinfo(1M)命令显示的顺序)。以下Korn shell脚本可用于显示从虚拟处理器ID到逻辑ID的映射。

#!/bin/ksh

NUMV=`psrinfo|fgrep"on-line"|wc-l`

set-A VID`psrinfo|cut-f1`

echo"Total number of on-line virtual processors=$NUMV"

echo

let"I=0"

let"J=0"

while[[$I-lt$NUMV]]

do

echo"Virtual processor ID${VID[I]}maps to logical ID${J}"

let"I=I+1"

let"J=J+1"

done

第2章?编译并运行OpenMP程序19

2.3处理器绑定

在将单个物理处理器映射到多个虚拟处理器的系统上,了解哪些逻辑ID与属于同一物

理处理器的虚拟处理器相对应会很有用。在以后的Solaris发行版中,可以使用以下

Korn shell脚本来显示此信息。

#!/bin/ksh

NUMV=`psrinfo|grep"on-line"|wc-l`

set-A VLIST`psrinfo|cut-f1`

set-A CHECKLIST`psrinfo|cut-f1`

let"I=0"

while[$I-lt$NUMV]

do

let"COUNT=0"

SAMELIST="$I"

let"J=I+1"

while[$J-lt$NUMV]

do

if[${CHECKLIST[J]}-ne-1]

then

if[`psrinfo-p${VLIST[I]}${VLIST[J]}`=1]

then

SAMELIST="$SAMELIST$J"

let"CHECKLIST[J]=-1"

let"COUNT=COUNT+1"

fi

fi

let"J=J+1"

done

if[$COUNT-gt0]

then

echo"The following logical IDs belong to the same physical processor:"

echo"$SAMELIST"

echo""

fi

let"I=I+1"

done

解释为SUNW_MP_PROCBIND指定的值:

如果为SUNW_MP_PROCBIND指定的值是TRUE,则线程会从逻辑ID为0的处理器开始,以

循环方式绑定到虚拟处理器。(指定TRUE等效于为SUNW_MP_PROCBIND指定值0。)

20

Sun Studio12Update1:OpenMP API用户指南?2009年9月

OpenMP API 用户指南

OpenMP API 用户指南 Sun? Studio 11 Sun Microsystems, Inc. https://www.doczj.com/doc/456213298.html, 文件号码 819-4818-10 2005 年 11 月,修订版 A 请将关于本文档的意见和建议提交至:https://www.doczj.com/doc/456213298.html,/hwdocs/feedback

版权所有 ? 2005 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, California 95054, U.S.A. 保留所有权利。 美国政府权利-商业用途。政府用户应遵循 Sun Microsystems, Inc. 的标准许可协议,以及 FAR(Federal Acquisition Regulations,即“联邦政府采购法规”)的适用条款及其补充条款。必须依据许可证条款使用。 本发行版可能包含由第三方开发的内容。 本产品的某些部分可能是从 Berkeley BSD 系统衍生出来的,并获得了加利福尼亚大学的许可。UNIX 是 X/Open Company, Ltd. 在美国和其他国家/地区独家许可的注册商标。 Sun、Sun Microsystems、Sun 徽标、Java 和 JavaHelp 是 Sun Microsystems, Inc. 在美国和其他国家/地区的商标或注册商标。所有的 SPARC 商标的使用均已获得许可,它们是 SPARC International, Inc. 在美国和其他国家/地区的商标或注册商标。标有 SPARC 商标的产品均基于由 Sun Microsystems, Inc. 开发的体系结构。 本服务手册所介绍的产品以及所包含的信息受美国出口控制法制约,并应遵守其他国家/地区的进出口法律。严禁将本产品直接或间接地用于核设施、导弹、生化武器或海上核设施,也不能直接或间接地出口给核设施、导弹、生化武器或海上核设施的最终用户。严禁出口或转口到美国禁运的国家/地区以及美国禁止出口清单中所包含的实体,包括但不限于被禁止的个人以及特别指定的国家/地区的公民。 本文档按“原样”提供,对于所有明示或默示的条件、陈述和担保,包括对适销性、适用性或非侵权性的默示保证,均不承担任何责任,除非此免责声明的适用范围在法律上无效。

openmp并行程序设计

OpenMP并行程序设计(一) OpenMP是一个支持共享存储并行设计的库,特别适宜多核CPU上的并行程序设计。今天在双核CPU机器上试了一下OpenMP并行程序设计,发现效率方面超出想象,因此写出来分享给大家。 在VC8.0中项目的属性对话框中,左边框里的“配置属性”下的“C/C++”下的“语言”页里,将OpenMP支持改为“是/(OpenMP)”就可以支持OpenMP了。 先看一个简单的使用了OpenMP程序 int main(int argc, char* argv[]) { #pragma omp parallel for for (int i = 0; i < 10; i++ ) { printf("i = %d\n", i); } return 0; } 这个程序执行后打印出以下结果: i = 0 i = 5 i = 1 i = 6 i = 2 i = 7 i = 3 i = 8 i = 4 i = 9 可见for 循环语句中的内容被并行执行了。(每次运行的打印结果可能会有区别) 这里要说明一下,#pragma omp parallel for 这条语句是用来指定后面的for循环语句变成并行执行的,当然for循环里的内容必须满足可以并行执行,即每次循环互不相干,后一次循环不依赖于前面的循环。 有关#pragma omp parallel for 这条语句的具体含义及相关OpenMP指令和函数的介绍暂时先放一放,只要知道这条语句会将后面的for循环里的内容变成并行执行就行了。 将for循环里的语句变成并行执行后效率会不会提高呢,我想这是我们最关心的内容了。

openMP实验总结报告

openMP实验报告 目录 openMP实验报告.............................................. 错误!未定义书签。 OpenMP简介.............................................. 错误!未定义书签。 实验一................................................... 错误!未定义书签。 实验二................................................... 错误!未定义书签。 实验三................................................... 错误!未定义书签。 实验四................................................... 错误!未定义书签。 实验五................................................... 错误!未定义书签。 实验六................................................... 错误!未定义书签。 实验七................................................... 错误!未定义书签。 实验八................................................... 错误!未定义书签。 实验总结................................................. 错误!未定义书签。 在学习了MPI之后,我们又继续学习了有关openMP的并行运算,通过老师的细致讲解,我们对openMP有了一个初步的了解: OpenMP简介 OpenMP是一种用于共享内存并行系统的多线程程序设计的库(Compiler Directive),特别适合于多核CPU上的并行程序开发设计。它支持的语言包括:C 语言、C++、Fortran;不过,用以上这些语言进行程序开发时,并非需要特别关注的地方,因为现如今的大多数编译器已经支持了OpenMP,例如:Sun Compiler,GNU Compiler、Intel Compiler、Visual Studio等等。程序员在编程时,只需要在特定的源代码片段的前面加入OpenMP专用的#pargma omp预编译指令,就可以“通知”编译器将该段程序自动进行并行化处理,并且在必要的时候加入线程同步及通信机制。当编译器选择忽略#pargma omp预处理指令时,或者编译器不支持OpenMP时,程序又退化为一般的通用串行程序,此时,代码

openMP学习笔记分析

1、OpenMP指令和库函数介绍 下面来介绍OpenMP的基本指令和常用指令的用法, 在C/C++中,OpenMP指令使用的格式为 #pragma omp 指令 [子句[子句]…] 前面提到的parallel for就是一条指令,有些书中也将OpenMP的“指令”叫做“编译指导语句”,后面的子句是可选的。例如: #pragma omp parallel private(i, j) parallel 就是指令,private是子句 为叙述方便把包含#pragma和OpenMP指令的一行叫做语句,如上面那行叫parallel语句。 OpenMP的指令有以下一些: parallel,用在一个代码段之前,表示这段代码将被多个线程并行执行 for,用于for循环之前,将循环分配到多个线程中并行执行,必须保证每次循环之间无相关性。 parallel for,parallel 和for语句的结合,也是用在一个for循环之前,表示for循环的代码将被多个线程并行执行。 sections,用在可能会被并行执行的代码段之前 parallel sections,parallel和sections两个语句的结合 critical,用在一段代码临界区之前 single,用在一段只被单个线程执行的代码段之前,表示后面的代码段将被单线程执行。 flush, barrier,用于并行区内代码的线程同步,所有线程执行到barrier时要停止,直到所有线程都执行到barrier时才继续往下执行。 atomic,用于指定一块内存区域被制动更新 master,用于指定一段代码块由主线程执行 ordered,用于指定并行区域的循环按顺序执行 threadprivate, 用于指定一个变量是线程私有的。 OpenMP除上述指令外,还有一些库函数,下面列出几个常用的库函数:omp_get_num_procs, 返回运行本线程的多处理机的处理器个数。 omp_get_num_threads, 返回当前并行区域中的活动线程个数。 omp_get_thread_num, 返回线程号 omp_set_num_threads, 设置并行执行代码时的线程个数 omp_init_lock, 初始化一个简单锁 omp_set_lock,上锁操作 omp_unset_lock,解锁操作,要和omp_set_lock函数配对使用。 omp_destroy_lock,omp_init_lock函数的配对操作函数,关闭一个锁 OpenMP的子句有以下一些 private, 指定每个线程都有它自己的变量私有副本。 firstprivate,指定每个线程都有它自己的变量私有副本,并且变量要被继承主线程中的初值。lastprivate,主要是用来指定将线程中的私有变量的值在并行处理结束后复制回主线程中的对应变量。 reduce,用来指定一个或多个变量是私有的,并且在并行处理结束后这些变量要执行指定的运算。

并行计算环境介绍

并行计算环境介绍 计算机系04 级研究生 武志鹏 1 MPI简介 目前两种最重要的并行编程模型是数据并行和消息传递。 数据并 行编程模型的编程级别比较高,编程相对简单,但它仅适用于数据并 行问题;消息传递编程模型的编程级别相对较低,但消息传递编程模 型可以有更广泛的应用范围。 MPI就是一种消息传递编程模型,并成为这种编程模型的代表和 事实上的标准。 1.1什么是 MPI 对MPI的定义是多种多样的,但不外乎下面三个方面: (1) MPI是一个库,而不是一门语言; (2) MPI是一种标准或规范的代表,而不特指某一个对它的实现; (3) MPI是一种消息传递编程模型,MPI虽然很庞大,但是它的最 终目的是服务于进程间通信这一目标的。 1.2 MPI的历史 MPI的标准化开始于1992年4月在威吉尼亚的威廉姆斯堡召开的分 布存储环境中消息传递标准的讨论会,由Dongarra,Hempel,Hey和 Walker建议的初始草案,于1992年11月推出并在1993年2月完成了修

订版,这就是MPI 1.0。 1995年6月推出了MPI的新版本MPI1.1,对原来的MPI作了进一步 的修改完善和扩充。 在1997年7月在对原来的MPI作了重大扩充的基础上又推出了MPI 的扩充部分MPI-2,而把原来的MPI各种版本称为MPI-1。 MPI-2的扩 充很多但主要是三个方面:并行I/O、远程存储访问和动态进程管理。 1.3 MPI的语言绑定 在MPI-1中明确提出了MPI和FORTRAN 77与C语言的绑定,并且 给出了通用接口和针对FORTRAN 77与C的专用接口说明。在MPI-2 中除了和原来的FORTRAN 77和C语言实现绑定之外,进一步与 Fortran90和C++结合起来。 1.4 MPI的实现版本 MPICH是一种最重要的MPI实现, 它是与MPI-1规范同步发展的版 本,每当MPI推出新的版本,就会有相应的MPICH的实现版本,另外 它还支持部分MPI-2的特征。 LAM-MPI也是一种MPI实现, 主要用于异构的计算机网络计算系统。 以上2种版本的MPI实现可以分别从以下网址下载: MPICH(最新版本1.2.7): https://www.doczj.com/doc/456213298.html,/mpi/mpich/ LAM-MPI(最新版本7.1.2):

OpenMP例程使用手册

OpenMP例程使用手册 目录 1 OpenMP简介 (2) 2 OpenMP例程编译 (2) 2.1安装gawk (2) 2.2编译例程 (2) 2.3拷贝例程到开发板 (3) 3例程测试 (5) 3.1 dspheap (5) 3.2 vecadd (6) 3.3 vecadd_complex (6) 3.4 其他例程测试说明 (7) 更多帮助.................................................................................................... 错误!未定义书签。 公司官网:https://www.doczj.com/doc/456213298.html, 销售邮箱:sales@https://www.doczj.com/doc/456213298.html, 公司总机:020-8998-6280 1/7技术论坛:https://www.doczj.com/doc/456213298.html, 技术邮箱:support@https://www.doczj.com/doc/456213298.html, 技术热线:020-3893-9734

1 OpenMP简介 OpenMP用于共享内存并行系统的多处理器程序设计的一套指导性的编译处理方案(Compiler Directive)。它是为在多处理机上编写并行程序而设计的一个应用编程接口。它包括一套编译指导语句和一个用来支持它的函数库。 OpenMP提供的这种对于并行描述的高层抽象降低了并行编程的难度和复杂度,这样程序员可以把更多的精力投入到并行算法本身,而非其具体实现细节。对基于数据分集的多线程程序设计,OpenMP是一个很好的选择。同时,使用OpenMP也提供了更强的灵活性,可以较容易的适应不同的并行系统配置。线程粒度和负载平衡等是传统多线程程序设计中的难题,但在OpenMP中,OpenMP库从程序员手中接管了部分这两方面的工作。 但是,作为高层抽象,OpenMP并不适合需要复杂的线程间同步和互斥的场合。OpenMP的另一个缺点是不能在非共享内存系统(如计算机集群)上使用。在这样的系统上,MPI使用较多。 2 OpenMP例程编译 2.1安装gawk 此工具为编译的必要工具,在Ubuntu下安装: Host#sudoapt-get install gawk 图1 2.2编译例程 请先安装ti-processor-sdk-linux-am57xx-evm-03.01.00.06,安装步骤请参照《相关软件

OpenMP的用法

在双重循环中怎样写OpenMP? 那要分析你的外循环跟内循环有没有彼此依赖的关系 unsigned int nCore = GetComputeCore(); unsigned int nStep = IMAGETILEYSIZE / nCore; #pragma omp parallel for private(Level0_x, Level0_y, ChangeLevel0_x, ChangeLevel0_y, InterX1, InterX2, InterY1, InterY2) for (int k = 0; k < nCore; k++) { int begin = k * nStep; int end = (k + 1) * nStep; for (int YOff = begin; YOff < end; YOff++) { for (int XOff = 0; XOff < IMAGETILEXSIZE; XOff++) { Level0_x = pPixelXBuf[YOff][XOff]; Level0_y = pPixelYBuf[YOff][XOff]; ChangeLevel0_x = Level0_x - XMin; ChangeLevel0_y = Level0_y - YMin; //寻找坐标在Level1Buf中对应的4个像素值 InterX1 = (int)(ChangeLevel0_x); InterX2 = (int)(ChangeLevel0_x + 1); InterY1 = (int)(ChangeLevel0_y); InterY2 = (int)(ChangeLevel0_y + 1); //双线性插值对Level0_Buf赋值 ZoomInterpolation(Level0Buf, Level1Buf, ChangeLevel0_x, ChangeLevel0_y, SamplesPerPixel, nXSize, nYSize, InterX1, InterX2, InterY1, InterY2, XOff, YOff); } } } 我也想应该这样,可是如果nCore=1的时候,外循环只循环一次,线程是怎么分配的呢。其实最外层的循环如果很多,就在外循环分配线程是不是就可以不考虑里面的循环了? nCore = 1,就是单核单cpu,多核循环就跟普通的循环没有差别, openmp默认有几个内核就开几个线程同时运行。所以单核openmp也没有什么意义,此时你也可以开两个线程“同时”运行,但在单核机器上,两个线程是不可能同时运行的 可以不考虑里面的循环。你只要保证外循环跟外循环之间,内寻环跟内循环之间没有数据依赖关系就行。 假设 for (int i = 0; i < 200000000; i++)

OpenMP API 用户指南

Sun Studio12Update 1:OpenMP API用户指南 Sun Microsystems,Inc. 4150Network Circle Santa Clara,CA95054 U.S.A. 文件号码821–0393 2009年9月

版权所有2009Sun Microsystems,Inc.4150Network Circle,Santa Clara,CA95054U.S.A.保留所有权利。 对于本文档中介绍的产品,Sun Microsystems,Inc.对其所涉及的技术拥有相关的知识产权。需特别指出的是(但不局限于此),这些知识产权可能包含一项或多项美国专利,以及在美国和其他国家/地区申请的待批专利。 美国政府权利-商业软件。政府用户应遵循Sun Microsystems,Inc.的标准许可协议,以及FAR(Federal Acquisition Regulations,即“联邦政府采购法规”)的适用条款及其补充条款。 本发行版可能包含由第三方开发的内容。 本产品的某些部分可能是从Berkeley BSD系统衍生出来的,并获得了加利福尼亚大学的许可。UNIX是X/Open Company,Ltd.在美国和其他国家/地区独家许可的注册商标。 Sun、Sun Microsystems、Sun徽标、Solaris徽标、Java咖啡杯徽标、https://www.doczj.com/doc/456213298.html,、Java和Solaris是Sun Microsystems,Inc.在美国和其他国家/地区的商标或注册商标。所有SPARC商标的使用均已获得许可,它们是SPARC International,Inc.在美国和其他国家/地区的商标或注册商标。标有SPARC商标的产品均基于由Sun Microsystems,Inc.开发的体系结构。 OPEN LOOK和Sun TM图形用户界面是Sun Microsystems,Inc.为其用户和许可证持有者开发的。Sun感谢Xerox在研究和开发可视或图形用户界面的概念方面为计算机行业所做的开拓性贡献。Sun已从Xerox获得了对Xerox图形用户界面的非独占性许可证,该许可证还适用于实现OPEN LOOK GUI 和在其他方面遵守Sun书面许可协议的Sun许可证持有者。 本出版物所介绍的产品以及所包含的信息受美国出口控制法制约,并应遵守其他国家/地区的进出口法律。严禁将本产品直接或间接地用于核设 施、导弹、生化武器或海上核设施,也不能直接或间接地出口给核设施、导弹、生化武器或海上核设施的最终用户。严禁出口或转口到美国禁运的国家/地区以及美国禁止出口清单中所包含的实体,包括但不限于被禁止的个人以及特别指定的国家/地区的公民。 本文档按“原样”提供,对于所有明示或默示的条件、陈述和担保,包括对适销性、适用性或非侵权性的默示保证,均不承担任何责任,除非此免责声明的适用范围在法律上无效。 090904@22749

基于openMP的并行计算实验

基于o p e n M P的并行计 算实验 文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

并行计算实验报告 课程:并行计算 姓名:郑波 学号44 班级:计算机科学与技术13-2班 日期:2015年12月7日 实验一:OpenMP基本使用 一、实验目的 1、熟悉OpenMP编程。 2、比较串行算法与并行算法在执行时间上的差别; 3、考察线程数目使用不同对并行算法执行时间的影响; 4、考察运算规模N对串、并行算法执行时间上的影响。 二、实验内容 1、使用OpenMP进行两个矩阵A和B的加法,并分析串行、并行时间的差别以及问题规模对程序运行时间的影响 三、实验步骤 1、整个程序的设计流程 ①全局变量设置三个宏定义过的size×size的二维数组啊a,b,c。

②初始化a数组为全1,b数组为全2 ③通过omp_set_num_threads()库函数设置线程数 ④调用openMP库函数omp_get_wtime()获取当前时间start #pragma omp parallel for开始做并行区部分 … 结束后再次调用omp_get_wtime()获取时间end,end-start即为并行消耗时间 ⑤再次调用时间函数更新strat 串行做一边矩阵相加 更新end,end-start即为串行耗时 代码如下: #include #include<> #define size 10000 using namespace std; int a[size][size], b[size][size], c[size][size]; int main() { for(int i=0;i!=size;++i) //initial the matrix for(int j=0;j!=size;++j){ a[i][j]=1; b[i][j]=2; } double start=omp_get_wtime(); omp_set_num_threads(4); #pragma omp parallel for for(int i=0;i

openmp简介(DOC)

OpenMP编程基础 1、可以说OpenMP制导指令将C语言扩展为一个并行语言,但OpenMP本身不是一种独立的并行语 言,而是为多处理器上编写并行程序而设计的、指导共享内存、多线程并行的编译制导指令和应用程序编程接口(API),可在C/C++和Fortran(77、90和95)中应用,并在串行代码中以编译器可识别的注释形式出现。OpenMP标准是由一些具有国际影响力的软件和硬件厂商共同定义和提出,是一种在共享存储体系结构的可移植编程模型,广泛应用与Unix、Linux、Windows等多种平台上。 2.1 OpenMP基本概念 首先来了解OpenMP的执行模式和三大要素。 2.1.1 执行模式 OpenMP的执行模型采用fork-join的形式,其中fork创建新线程或者唤醒已有线程;join即多线程的会合。fork-join执行模型在刚开始执行的时候,只有一个称为“主线程”的运行线程存在。主线程在运行过程中,当遇到需要进行并行计算的时候,派生出线程来执行并行任务。在并行执行的时候,主线程和派生线程共同工作。在并行代码执行结束后,派生线程退出或者阻塞,不再工作,控制流程回到单独的主线程中。 OpenMP的编程者需要在可并行工作的代码部分用制导指令向编译器指出其并行属性,而且这些并行区域可以出现嵌套的情况,如图2.1所示。 对并行域(Paralle region)作如下定义:在成对的fork和join之间的区域,称为并行域,它既表示代码也表示执行时间区间。 对OpenMP线程作如下定义:在OpenMP程序中用于完成计算任务的一个执行流的执行实体,可

以是操作系统的线程也可以是操作系统上的进程。 2.1.2 OpenMP编程要素 OpenMP编程模型以线程为基础,通过编译制导指令来显式地指导并行化,OpenMP为编程人员提供了三种编程要素来实现对并行化的完善控制。它们是编译制导、API函数集和环境变量。 编译制导 在C/C++程序中,OpenMP的所有编译制导指令是以#pragma omp开始,后面跟具体的功能指令(或命令),其具有如下形式: #pragma omp 指令[子句[, 子句] …] 支持OpenMP的编译器能识别、处理这些制导指令并实现其功能。其中指令或命令是可以单独出现的,而子句则必须出现在制导指令之后。制导指令和子句按照功能可以大体上分成四类: 1)并行域控制类; 2)任务分担类; 3)同步控制类; 并行域控制类指令用于指示编译器产生多个线程以并发执行任务,任务分担类指令指示编译器如何给各个并发线程分发任务,同步控制类指令指示编译器协调并发线程之间的时间约束关系等。 1)OpenMP规范中的指令有以下这些: ? parallel:用在一个结构块之前,表示这段代码将被多个线程并行执行; ? for:用于for循环语句之前,表示将循环计算任务分配到多个线程中并行执行,以实现任务分担,必须由编程人员自己保证每次循环之间无数据相关性; ? parallel for:parallel 和for指令的结合,也是用在for循环语句之前,表示for循环体的代码将被多个线程并行执行,它同时具有并行域的产生和任务分担两个功能; ? sections:用在可被并行执行的代码段之前,用于实现多个结构块语句的任务分担,可并行执行的代码段各自用section指令标出(注意区分sections和section); ? parallel sections:parallel和sections两个语句的结合,类似于parallel for; ? single:用在并行域内,表示一段只被单个线程执行的代码; ? critical:用在一段代码临界区之前,保证每次只有一个OpenMP线程进入; ? flush:保证各个OpenMP线程的数据影像的一致性; ? barrier:用于并行域内代码的线程同步,线程执行到barrier时要停下等待,直到所有线程都执行到barrier时才继续往下执行;

OpenMP程序的编译和运行

SHANGHAI UNIVERSITY 学院计算机工程与科学学院实验OpenMP程序的编译和运行姓名陈帅 学号12122208 教师刘芳芳 时间2015.05.06 报告成绩

实验2-1. OpenMP程序的编译和运行 1.实验目的 1) 在Linux平台上编译和运行OpenMP程序; 2) 在Windows平台上编译和运行OpenMP程序。 3) 掌握OpenMP并行编程基础。 2.实验环境 1) 硬件环境:计算机一台; 2) 软件环境:Linux、Win2003、GCC、MPICH、VS2008或其他版本Visual Studio; 3.实验内容 1. Linux下OpenMP程序的编译和运行。OpenMP是一个共享存储并行系统上的应用编程接口,支持C/C++和FORTRAN等语言,编译和运行简单的"Hello World"程序。在Linux下编辑hellomp.c源程序,或在Windows下编辑并通过附件中的FTP工具(端口号:1021)上传,用"gcc -fopenmp -O2 -o hellomp.out hellomp.c"命令编译,用"./hellomp.out"命令运行程序。注:在虚拟机中当使用vi编辑文件时,不是以ESC键退出插入模式,可以使用“Ctrl+c”进入命令模式,然后输入wq进行存盘退出。 代码如下: #include #include int main() { int nthreads,tid; omp_set_num_threads(8); #pragma omp parallel private(nthreads,tid) { tid=omp_get_thread_num(); printf("Hello World from OMP thread %d\n",tid); if(tid==0) { nthreads=omp_get_num_threads(); printf("Number of threads is %d\n",nthreads); } } }

OpenMP发展与优势

OpenMP发展与优势 OpenMP的规范由SGI发起,它是一种面向共享内存以及分布式共享内存的多处理器多线程并行编程语言。OpenMP是一种共享内存并行的应用程序编程接口。所有的处理器都被连接到一个共享的内存单元上,处理器在访问内存的时候使用的是相同的内存编址空间。由于内存是共享的,因此,某一处理器写入内存的数据会立刻被其它处理器访问到。 OpenMP具有良好的可移植性,支持Fortran和C/C++编程语言,操作系统平台方面则支持UNIX系统以及Windows 系统。OpenMP的重要性在于,它能够为编写多线程程序提供一种简单的方法,而无需程序员进行复杂的线程创建、同步、负载平衡和销毁工作[1]。 2.2 OpenMP多线程编程基础 OpenMP的编程模型以线程为基础,通过编译指导语句来显式地指导并行化,为编程人员提供了对并行化的完整的控制。在并行执行的时候,主线程和派生线程共同工作。在并行代码结束执行后,派生线程退出或者挂起,不再工作,控制流回到单独的主线程中。OpenMP的功能由两种形式提供:编译指导语句和运行时库函数,下面分别介绍。 2.2.1编译指导语句 编译指导语句的含义是在编译器编译程序的时候,会识别特定的注释,而这些特定的注释就包含着OpenMP程序的一些语意。例如在C/C++程序中,用 #pragma opm parallel来标示一段并行程序块。在一个无法识别OpenMP语意的编译器中,会将这些特定的注释当作普通的程序注释而被忽略。因此,仅使用编译指导语句编写的OpenMP程序就能够同时被普通编译器和支持OpenMP的编译器处理。这种性质带来的好处就是用户可以用同一份代码来编写串行和并行程序,或者在把串行程序改编成并行程序的时候,保持串行源代码部分不变,从而极大地方便了程序编写人员。 编译指导语句的形式为: #pragam omp [clause[[,] clause]. . .] 其中directive部分就包含了具体的编译指导语句,包括parallel, for, parallel for, section, sections, single, master, critical, flush, ordered和atomic。这些编译指导语句或者用来分配任务,或者用来同步。后面可选的子句clause给出了相应的编译指导语句的参数,子句可以影响到编译指导语句的具体行为,每一个编译指导语句都有一系列适合它的子句。 2.2.2运行时库函数 另外一种提供OpenMP功能的形式就是OpenMP的运行时库函数,它用于设置和获取执行环境的相关信息,它们当中也包含一系列用以同步的API。要使

基于多核DSP的OpenMp研究与实现

Journal of Image and Signal Processing 图像与信号处理, 2016, 5(4), 147-154 Published Online October 2016 in Hans. https://www.doczj.com/doc/456213298.html,/journal/jisp https://www.doczj.com/doc/456213298.html,/10.12677/jisp.2016.54017 文章引用: 张琪, 王正勇, 余艳梅. 基于多核DSP 的OpenMp 研究与实现[J]. 图像与信号处理, 2016, 5(4): 147-154. Research and Realization of OpenMp Based on Muiticore DSP Qi Zhang, Zhengyong Wang, Yanmei Yu Image Information Institute, College of Electronics and Information Engineering, Sichuan University, Chengdu Sichuan Received: Sep. 18th , 2016; accepted: Oct. 4th , 2016; published: Oct. 7th , 2016 Copyright ? 2016 by authors and Hans Publishers Inc. This work is licensed under the Creative Commons Attribution International License (CC BY). https://www.doczj.com/doc/456213298.html,/licenses/by/4.0/ Abstract Aiming at the complexity of multicore model in practical application, the three major models of data flow, master-slave and OpenMp are analyzed in this paper. Because the OpenMp model is easier to be implemented, it is taken as the major research object. Firstly, the implementation principle of OpenMp model is studied; the time consumed by the thread creation and task parti-tioning in the nested loop of the OpenMp model is analyzed in this paper. Then, the relationship between the core number and the number of threads in the OpenMp model is also studied. Finally, taking TMS320C6678 multi-core DSP of TI Company as the core processor, a simple image processing algorithm is used to verify the conclusions drawn from the above research. The results of test have proved OpenMp model when the number of threads is equal to the core number shortest execution time. Keywords TMS320C6678, OpenMp, Linear Assembly, Threads Scheduling 基于多核DSP 的OpenMp 研究与实现 张 琪,王正勇,余艳梅 四川大学电子信息学院图像信息研究所,四川 成都 收稿日期:2016年9月18日;录用日期:2016年10月4日;发布日期:2016年10月7日 Open Access

OpenMP并行程序的编译器优化

OpenMP 并行程序的编译器优化 张 平,李清宝,赵荣彩 (解放军信息工程大学信息工程学院,郑州 450002) 摘 要:OpemMP 标准以其良好的可移植性和易用性被广泛应用于并行程序设计。该文讨论了OpenMP 并行程序的编译器优化算法,在编译过程中通过并行区合并和扩展,实现并行区重构,并在并行区中实现了基于跨处理器相关图的barrier 同步优化。分析验证表明,这些优化策略减少了并行区和barrier 同步的数目,有效地提高了OpenMP 程序的并行性能。 关键词:跨处理器相关;barrier 同步;并行区重构;数据相关图 Compiler Optimization Algorithm for OpenMP Parallel Program ZHANG Ping, LI Qingbao, ZHAO Rongcai (School of Information and Engineering, PLA Information and Engineering University, Zhengzhou 450002) 【Abstract 】OpenMP is widely used in parallel programming for its portability and simplicity. This paper introduces the compiler optimization algorithms for OpenMP parallel program. In compiling, parallel regions are reconstructed through extension and combination. And a barrier synchronization optimization algorithm based on cross-processor dependence graph is developed to eliminate redundant barriers in each parallel region. Analysis show that these strategies reduce the number of parallel region and barrier synchronization, and can improve the parallel performance of OpenMP program. 【Key words 】Cross-processor dependence; Barrier synchronization; Parallel region reconstruction; Data dependence graph 计 算 机 工 程Computer Engineering 第32卷 第24期 Vol.32 No.24 2006年12月 December 2006 ·软件技术与数据库· 文章编号:1000—3428(2006)24—0037—04 文献标识码:A 中图分类号:TP311 OpenMP 是共享内存并行程序设计的工业标准,其目标 是为具有统一地址空间的并行系统提供可移植、可扩展的开发接口,它通过编译指示和运行时库函数扩展C 、C++和Fortran 语言支持并行。 OpenMP 为程序员提供了一种简单的并行程序设计方法,可以在串行程序的基础上方便地开发出并行程序。但应用程序员往往缺乏对程序并行性的分析(如数据相关性分析和通信分析等),许多OpenMP 程序的性能也并不理想,并行效率较低;另一方面,如果要求程序员在编写并行程序时进行深入的程序分析就会增加程序设计的难度,违背OpenMP 的易用性原则,也是不现实的。因此,我们考虑在编译过程中实现OpenMP 程序的优化。 本文讨论了循环级并行的OpenMP 并行程序的编译器优化策略:通过并行区的扩展和合并重构并行区,减少并行区的数目;在重构后的并行区中,依据计算的分配调度进行跨处理器相关性分析,建立跨处理器相关图,消除冗余barrier 同步。 1 OpenMP 并行程序 OpenMP 利用编译指示、运行时库函数和环境变量描述程序的并行特性。 1.1 OpenMP 编译指示 OpenMP 的编译指示分为并行结构、工作共享结构、同步编译、数据环境指示等几类。常用的编译指示包括:(1)#pragma omp parallel 说明并行结构,其中的代码被多个工作线程执行;(2)#pragma omp for 说明工作共享结构,指示循环被分配给多个工作线程并行执行;(3)#pragma omp barrier 为同步指示,标记线程在此等待,直到所有线程都执行到这个点,再继续向下执行。 在omp parallel, omp for 的结束都隐含着一个barrier 同步点,为减少不必要的同步,OpenMP 提供了no wait 子句,指 示可以不进行barrier 同步。 1.2 OpenMP 的执行模式 OpenMP 程序遵循fork-and-join 执行模式(如图1)。程序从主线程开始执行,当遇到并行结构,主线程启动(创建或唤醒)一组工作线程并行执行其中的语句。当遇到工作共享结构,工作负荷由线程组中的各个线程分担;并行区结束,线程组中的线程同步,工作线程终止(消亡或睡眠 ),主线程继续执行。 在程序执行过程中,可多次执行fork-and-join 过程,需要在串行执行和并行执行间进行多次切换。实验表明[1],OpenMP 执行过程中,串行执行和并行执行切换带来的额外执行开销是影响OpenMP 程序性能的一个重要因素。 图1 OpenMP 程序的执行模式 基金项目:国防科研基金资助重点项目 作者简介:张 平(1969-),女,博士生,主研方向:并行识别,并行编译;李清宝,副教授;赵荣彩,教授、博导 收稿日期:2006-02-24 E-mail :lqb215@https://www.doczj.com/doc/456213298.html,

Intel高级 OpenMP

高级OpenMP*编程 简介 作为白皮书三部曲中的最后一篇,本文将为您介绍经验丰富的C/C++程序员如何开始使用OpenMP*,以及如何在应用中简化线程的创建、同步以及删除工作。我们的一系列白皮书将为您全面揭秘OpenMP,其中第一篇向您简要介绍了OpenMP 最常见的特性:循环工作共享。第二篇告诉您如何充分利用非循环并行能力及如何使用同步指令。最后一篇则讨论了库函数、环境变量、如何在发生错误时调试应用,以及最大限度地发挥性能的一些技巧。运行时库函数 您可能还记得,OpenMP 由一套编译指令、函数调用和环境变量组成。前两篇文章只讨论了编译指令, 本文将重点探讨函数调用和环境变量。这样安排的理由很简单:编译指令是OpenMP 的“原因”,它们提供最大程度的简易性,不需要改变源代码,并且您可忽略它们来生成代码的系列版本。另一方面,使用函数调用需要改变程序,这将为执行系列版本(如需)带来困难。如果遇到疑问,请您在计划使用函数调用(包括标头文件)时,尝试使用编译指令并保留函数调用。当然,您还应继续使用英特尔?C++编译器命令行切换/Qopenmp 。进行链接不需要其它库。 下表列出了四个最常使用的库函数,分别用于检索线程总数,设置线程数,返回当前线程数,及返回可用逻辑处理器的数量。如欲获得OpenMP 库函数的全部列表,请务必访问OpenMP 网站:https://www.doczj.com/doc/456213298.html, *。

算作两颗处理器。 以下为使用上述函数来打印字母表的例子。 omp_set_num_threads(4); #pragma omp parallel private(i) {//This code has a bug.Can you find it? int LettersPerThread=26/omp_get_num_threads(); int ThisThreadNum=omp_get_thread_num(); int StartLetter='a'+ThisThreadNum*LettersPerThread; int EndLetter='a'+ThisThreadNum*LettersPerThread+LettersPerThread; for(i=StartLetter;i

相关主题
文本预览
相关文档 最新文档