上传者: 26749843
|
上传时间: 2021-11-08 17:02:03
|
文件大小: 4.28MB
|
文件类型: -
6.3 目标代码形式
对于 OpenMP 的并行域管理功能的实现,一部分在代码变换中体现,另一部分在运行库
中提供支持。对于并行域如此复杂的功能,全部依靠代码翻译变换来完成并不现实,因此许多
功能就只好压入到运行库中。如此一来,编译工作关于并行域管理的部分反而变得简单,而运
行库则需要负担更多的工作。此时在代码变换上只留下了启动并行域的代码(包括执行任务函
数)、任务函数的封装两大任务。可行的目标代码形式如图 6.4:
图 6.4 parallel 的目标代码框架
在 GCC 的 GOMP 中变换前后的代码形式如下:
1. #pragma omp parallel 变换前的代码
2. {
3. body;
4. }
下面是变换后的代码,分成两部分:
1. void subfunction (void *data) 这个是任务函数
2. {
3. use data;
4. body;
5. }
……
6. setup data; 数据共享、私有化等处理
7. GOMP_parallel_start (subfunction, &data, num_threads); 创建并行域
8. subfunction (&data); 调用任务函数
9. GOMP_parallel_end (); 退出并行域
上 面 的 代 码 变 换 与 图 6.4 基 本 一 致 , GOMP 中 的 GOMP_parallel_start() 和
GOMP_parallel_end()等函数是 GOMP 运行库中的函数。OMPi 的实现略有不同。
这里只是给出实现 OpenMP 并行域管理的代码基本形式,与具体的 C 编程语言绑定的代
码“框架”将在第 9 章给出。
串行代码
并
行
域
#pragma omp parallel
数据环境准备
并行域创建代码
……
执行任务函数
……
退出并行域
{
……
……
……
}
任务函数
封装
替换