IntelBook_cn.doc

Similar documents
第7章-并行计算.ppt

并行算法实践

119,,,,,, (, ), : (1),,,,,, (2),,,, (3),,,,,20,,,,,,,,

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

PowerPoint Presentation

第3章.doc

IntelBook_cn.doc

chap07.key

, 即 使 是 在 昏 暗 的 灯 光 下, 她 仍 然 可 以 那 么 耀 眼 我 没 有 地 方 去, 你 会 带 着 我 么 杜 晗 像 是 在 嘲 笑 一 般, 嘴 角 的 一 抹 冷 笑 有 着 不 适 合 这 个 年 龄 的 冷 酷 和 无 情, 看 着 江 华 的 眼 神 毫 无 温

Microsoft PowerPoint - multicore curriculum of sspku.ppt

提纲 1 2 OS Examples for 3

<4D F736F F F696E74202D BDE1B9B9BBAFB3CCD0F2C9E8BCC D20D1ADBBB7>








1

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

净 利 润 和 扣 除 非 经 常 性 损 益 后 归 属 于 母 公 司 股 东 的 净 利 润 分 别 为 亿 元 和 亿 元 ; 3 假 设 本 公 司 2016 年 扣 除 非 经 常 性 损 益 前 归 属 于 母 公 司 股 东 的 净 利 润 分 别 为 6

游戏攻略大全(五十六).doc

牧 者 心 聲 要 因 心 懷 平 而 作 惡 要 謹 慎 言 行 免 得 舌 頭 犯 罪 ; 惡 人 時 候 要 用 嚼 環 勒 住 口 ( 詩 三 十 九 1) 今 天 社 會 和 教 會 裏 極 其 渴 望 人 能 以 具 體 行 動 勉 勵 走 善 良 正 直 路 作 好 榜 樣 ; 可 惜

while (queue.isempty() && newtasksmaybescheduled) queue.wait(); if (queue.isempty()) break; // Queue is empty and will forever remain; die if (!taskfi

团 学 要 闻 我 校 召 开 共 青 团 五 届 九 次 全 委 ( 扩 大 ) 会 议 3 月 17 日, 我 校 共 青 团 五 届 九 次 全 委 ( 扩 大 ) 会 议 在 行 政 办 公 楼 五 楼 会 议 室 举 行, 校 团 委 委 员 各 院 ( 系 ) 团 委 书 记 校 学 生

範本檔

糖尿病食譜


Microsoft Word 養生與保健_中山大學_講義


萬里社區老人健康照護手冊

Microsoft Word - 強制汽車責任保險承保及理賠作業處理辦法 doc

Microsoft Word - 06.Understanding of Pregnancy and Birth.doc

(➂)11. 炎 炎 夏 日, 即 使 下 起 滂 沱 大 雨, 都 消 除 不 了 令 人 心 煩 的 暑 氣 這 句 話 主 要 想 表 達 什 麼? ➀ 夏 日 裡 經 常 下 著 滂 沱 大 雨, 令 人 心 煩 ➁ 下 著 滂 沱 大 雨 的 日 子, 可 以 消 除 暑 氣 ➂ 夏 日

附 件 一 : 办 理 集 中 式 银 期 转 账 业 务 网 点 名 单 序 号 地 区 网 点 名 称 地 址 联 系 人 电 话 23 工 商 银 行 安 徽 省 铜 陵 百 大 支 行 铜 陵 市 长 江 东 路 50 号 鲁 桂 珍 工 商 银 行 安 徽

2. 二 年 級 吳 毓 秀 老 師 : 感 謝 午 餐 公 司 平 時 均 能 準 時 送 餐, 但 希 望 能 不 要 使 用 加 工 品, 且 學 生 反 映 希 望 能 多 加 蛋 品 的 食 物 3. 三 年 級 柯 阿 青 老 師 : 雞 肉 有 血 水 味, 請 午 餐 公 司 能 調

高雄市立五福國民中學九十四學年度第一學期第三次段考二年級本國語文學習領域試題卷

人 物 春 秋 杨 永 泰 将 其 削 藩 策 略 概 括 为 : 以 经 济 方 法 瓦 解 冯 玉 祥 的 第 二 集 团 军, 以 政 治 方 法 解 决 阎 锡 山 的 第 3 集 团 军, 以 军 事 方 法 解 决 李 宗 仁 的 第 四 集 团 军, 以 外 交 方 法 对 付 张 学

台北老爺校外實地參訪結案報告



,,,,,,, (,, ),,,,,,,,,,,,,,, ,,, 4 11,, ( ),,,, ( ), :, ( ),,, 1995, 66 ; ( ),, 1996, , 3-4,,


2002 4,,, 1941,,,,,,,,,,,,,,,,,, : ;:, 1991,

2011, Oracle / U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware

C 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

第一章 概论

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

C++ 程式設計

C/C++ - 文件IO

FY.DOC

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

三种方法实现Hadoop(MapReduce)全局排序(1)

綜合社會保障援助指引

880041_C_Unique_REDACTED_.indb

绘制OpenCascade中的曲线

前言 编写 OpenMP 编译原理及实现技术 教材是深圳大学 计算机科学与技术国家特色专业建设点 的建设内容之一 该教材和相应课程的设计目的有三点 : 衔接本科 编译原理 课程 扩展 OpenMP 并行语言编译的知识 增强学生的动手实践和编程能力, 书中以 OpenMP 的一个开源编译器 OMPi

Java

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

chp3

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

Microsoft Word - 新1-12.doc

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p

Guava学习之Resources

说 : 荀 子 极 偏 驳, 只 一 句 性 恶, 大 本 已 失 5 朱 熹 说 : 荀 扬 不 惟 说 性 不 是, 从 头 到 底 皆 不 识 6 采 取 的 都 是 这 种 理 论 框 架 另 一 种 理 论 框 架 始 于 20 世 纪 前 期, 这 便 是 诸 子 学 研 究 的 框 架


V2.indd

06-4.indd

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

Practical Guide For Employment Of Foreign Domestic Helpers

BOOL EnumWindows(WNDENUMPROC lparam); lpenumfunc, LPARAM (Native Interface) PowerBuilder PowerBuilder PBNI 2

CC213

untitled

( 含 要 ) 1-2 用 或 雇 用, 抑 或 有 無 俸 給 文 職 或 武 職, 政 官 或 事 官 均 屬 之, 其 不 以 具 備 人 資 格 為 限, 因 此 屬 於 最 廣 義 之 念 四 廣 義 念 之 依 服 24 條 之 規 定 : 本 於 受 有 俸 給 之 文 武 職, 及

游戏攻略大全(五十二).doc

游戏攻略大全(五十一).doc

新版 明解C++入門編

¨Æ·~½g¡ã¾·~¤ÀÃþ

% 25% (i) 95% 96,290,900 (ii) 99.9% 17,196,000 (iii) 99.9% 89,663,100 2

Microsoft Word - om388-rnt _excl Items 16 & 38_ _final_for uploading_.doc

Microsoft Word - MSP430 Launchpad 指导书.docx

國立中山大學學位論文典藏.PDF

Microsoft Word mpc-min-chi.doc

( ) 1

穨cwht.PDF

900502_Oasis.indb

bnb.PDF

untitled

Microsoft Word _4

郑州大学(下).doc

厨房小知识(六)

广 东 纺 织 职 业 技 术 学 院 发 展 党 员 公 示 制 实 施 办 法 关 于 推 荐 优 秀 团 员 作 为 党 的 发 展 对 象 工 作 的 意 见 后 勤 管 理 工 作 广 东 纺 织 职 业 技 术 学 院 新 引 进 教 职 工 周 转 房 管 理


游戏攻略大全(五十).doc

金融英语证书考试大纲


Transcription:

5.2.2 并行区域编程 上面我们曾经说过循环并行化实际上是并行区域编程的一个特例, 在这一小节我们将详细讨论非循环的并行区域编程 并行区域简单的说就是通过循环并行化编译制导语句使得一段代码能够在多个线程内部同时执行 本章的第一个例子就是一个并行区域的例子, 根据环境变量的设置, 该程序在相应的线程内部打印出信息 并行区域编译制导语句的格式与使用限制 在 C/C++ 语言中, 并行区域编写的格式如下所示 : [clause[clause] ] block 其中 block 是需要在多个线程中执行的代码块, 每一个线程在遇到并行区域的编译制导语句的时候, 都会同时执行跟随其后的程序代码块 在并行区域的编译制导语句后面也可以跟随一些子句, 包括 private,shared,default,reduction,if,copyin 等子句都可以在并行区域编译制导语句中出现 在后面的叙述中, 我们将介绍每一个子句的功能和作用 parallel 编译制导语句与循环并行化 parallel for 语句类似, 在使用到程序块之前也有一定的限制 程序块必须是一个只有单一入口和单一出口的程序块, 不能从外面转入到程序块的内部, 也不允许从程序块内部有多个出口转到程序块之外, 在程序块内部的跳转是允许的 在程序块内部直接调用 exit 函数来退出整个程序的执行也是允许的 parallel 编译制导语句的执行过程为了理解编译制导语句 parallel 语句的执行过程, 我们先看看如下两个程序的执行结果 这两个程序非常简单, 且相似, 唯一的不同之处在于前面一个程序的编译制导语句是并行区域编译制导语句 parallel 而后面一个程序的编译制导语句是循环并行化的编译制导语句 parallel for 代码 5.11parallel 编译制导语句 1 for(int i=0;i<5;i++) printf("hello world i=%d\n",i); 程序的执行结果 : hello world i=0 hello world i=0 hello world i=1 hello world i=1 hello world i=2 hello world i=2 hello world i=3 hello world i=3

hello world i=4 hello world i=4 代码 5.12parallel 编译制导语句 2 for for(int i=0;i<5;i++) printf("hello world i=%d\n",i); 程序的执行结果 : hello world i=0 hello world i=3 hello world i=1 hello world i=4 hello world i=2 可以看到, 两个程序唯一的区别在于程序中黑体标出的 for ( 在执行的过程中, 环境变量 OMP_NUM_THREADS=2 ) 从这两个执行结果中我们可以明显地看到并行区域与循环并行化的区别, 即并行区域采用了复制执行的方式, 将代码在所有的线程内部都执行一次 ; 而循环并行化则采用了工作分配的执行方式, 将循环所需要的所有工作量按照一定的方式分配到各个执行线程中, 所有线程执行工作的总和是原先串行执行所完成的工作量 总结上述的并行区域 parallel 语句的作用是当程序遇到 parallel 编译制导语句的时候, 就会生成相应数目 ( 根据环境变量 ) 的线程组成一个线程组, 并将代码重复地在各个线程内部执行 parallel 的末尾有一个隐含的同步屏障 (barrier), 所有线程完成所需的重复任务有, 在这个同步屏障出会和 (join) 此时, 线程组的主线程 (master) 继续执行, 而相应的子线程 (slave) 则停止执行 线程私有数据与 threadprivate,copyin 子句前面我们已经看到在循环并行化的过程中, 有一套默认的规则用来控制变量在线程之间的共享属性 除了 private 子句能够产生线程私有的变量之外, 还需要考虑一些全局的数据 这些全局的数据可能是在整个程序运行过程中都需要的数据, 或者是在源程序中跨多个文件所需要的变量 在通常的情况下, 这些数据都是共享的数据, 所有的线程访问的都是共享内存空间中的同一内存地址内容 然而, 有的时候, 对于每一个线程来说, 可能需要生成自己私有的线程数据, 此时, 就需要使用 threadprivate 子句用来标明某一个变量是线程私有数据, 在程序运行的过程中, 不能够被其它线程访问到 代码 5.13 线程私有数据与 threadprivate 子句 int counter=0; #pragma omp threadprivate(counter) //using threadprivate void inc_counter() counter++;

int main(int argc, char * argv[]) for(int i=0;i<10000;i++) inc_counter(); printf("counter=%d\n",counter); 在上述的程序例子中, 我们使用了 threadprivate 语句 ( 使用黑体并有注释的语句 ), 使得 counter 变成了每一个线程拥有的私有变量 此时的执行过程最后结果都为 : counter=10000 而如果将含有注释的那一行删除, 就将全局变量 counter 变为共享, 执行过程中会产生数据 冲突, 执行结果不可预知, 下面是可能的一次执行结果 : counter=15194 可以明显看到出现了数据相关性 对于所有的线程私有全局变量来说, 除了主线程, 其它线程的私有变量在运行过程中是没有 初始化的, 为了使用主线程的变量初始化的值, 我们使用 copyin 子句对线程私有的全局变 量进行初始化 代码 5.14 线程私有数据与 copyin 子句 int global=0; #pragma omp threadprivate(global) int main(int argc, char * argv[]) global=1000; copyin(global) printf("global=%d\n",global); global=omp_get_thread_num(); printf("global=%d\n",global); printf("parallel again\n"); printf("global=%d\n",global);

程序的执行结果为 : global=1000 global=1000 global=0 parallel again global=0 global=1 可以看出, 通过 copyin 的操作, 确实将线程的私有变量初始化为主线程中相应的全局变量 的值 在并行区域执行完毕退出后, 主线程与子线程中的相应的全局变量继续有效, 并且在 在一次进入并行区域时, 使用上一次退出时所赋的值 并行区域之间的工作共享上述的 parallel 编译制导语句提供了在 OpenMP 程序中一种简单的并行方法, 能够将工作在多个线程之间重复运行 实际上, 对于并行程序来说, 相对于重复地做同样一件工作, 更有意义的是将一定的工作量分配到各个线程, 使得各个线程共同完成更大的工作量 因此, 并行程序希望能够在不同的数据集上执行相同的计算, 甚至希望并行执行完全不同的工作 在通常的并行程序编写中, 一般会使用工作队列的方式将工作放置到一个队列中, 每一个线程每次从队列中获取一件工作 而在 OpenMP 程序中, 每一个线程都可以调用 omp_get_thread_num() 来得到自己唯一的线程号, 因此可以利用这个线程号来获得不同的工作任务执行 实际上, 在 OpenMP 支持的语法中, 可以直接使用编译制导语句 for 将任务分配到各个线程, 就像前一节所说的循环并行化一样 ; 另外, 也可以用 sections 编译制导语句以及 section 子句自然地将不同的工作任务编写成不同的代码片段并行执行 在下面的内容中, 我们针对每一种编程方式给出例子讲解如何进行工作共享的并行区域编程 工作队列 工作队列的基本工作过程即为维持一个工作的队列, 线程在并行执行的时候, 不断从这个队 列中取出相应的工作完成, 直到队列为空为止 代码 5.15 工作队列 int next_task=0; int get_next_task() int task; #pragma omp critical // 用来做同步操作 Used to conduct synchronization if(next_task<max_task) else task=next_task; next_task++; task=-1; return task;

void task_queue() int my_task; private(my_task) my_task=get_next_task(); while(my_task!=-1) get_task_done(my_task); my_task=get_next_task(); 上述程序的并行部分不断从一个任务队列中取出相应的任务完成, 直到完成任务队列中的所 有任务 根据线程号分配任务 由于每一个线程在执行的过程中的线程标识号是不同的, 可以根据这个线程标识号来分配不 同的任务, 下面的例子程序就演示了如何根据线程标识号来完成不同的任务 代码 5.16 根据线程号分配任务 private(myid) nthreads=omp_get_num_threads(); myid=omp_get_thread_num(); get_my_work_done(myid,nthreads); 在上述的程序中, 首先获得当前所有线程的数目, 并且根据线程的总数以及相应的线程标识 号来确定相应的工作, 完成任务的并行分配 使用循环语句分配任务由于通过循环并行化在线程之间分配相应的任务已经在上一个小节详细讲述, 在这里就不进一步举例子说明了 实际上, 循环并行化是可以单独在并行化区域中出现的, 每一个循环中的任务就被分配到各个工作线程中 代码 5.17 使用循环语句分配任务 #pragma omp for printf("outside loop thread=%d\n",omp_get_thread_num()) ; for(int i=0;i<4;i++)

printf("inside loop i=%d thread=%d\n",i,omp_get_thread_num()) ; 程序的运行结果 : outside loop thread=0 outside loop thread=1 inside loop i=2 thread=1 inside loop i=0 thread=0 inside loop i=3 thread=1 inside loop i=1 thread=0 可以看出, 在循环的外部, 程序代码被各个线程复制执行, 而在循环的内部, 循环的所有任 务被各个线程分别完成 从总体上来说, 循环执行的次数与串行执行的次数一致 上述的工作空间的共享实际上是编程人员通过自己的经验, 使用 OpenMP 一些接口编写自己 所需的任务分配代码 实际上, 在 OpenMP 编程规范中已经对能够在不同的线程中执行不同 的任务有所支持 使用工作分区 (sections) 的方法就能够达到这一点 工作分区编码 (sections) 下面是一个工作分区编码的示例 代码 5.18 一个工作分区编码的示例 sections #pragma omp section printf("section 1 thread=%d\n",omp_get_thread_num()) ; #pragma omp section printf("section 2 thread=%d\n",omp_get_thread_num()) ; #pragma omp section printf("sectino 3 thread=%d\n",omp_get_thread_num()) ; 程序运行结果为 : section 1 thread=0 section 2 thread=1 sectino 3 thread=0 可以看到, 在使用工作分区编码的时候, 各个线程自动从各个分区中获得任务执行 并且在 执行完一个分区的时候, 如果分区组里面还有未完成的工作, 则继续取得任务完成