Page 76 - 《软件学报》2024年第6期
P. 76
2652 软件学报 2024 年第 35 卷第 6 期
进程程序 线程程序
进程代码段 运算控制核心
运算核心阵列
启动加速线程
#pragma ccc async call
f1() 加速线程任务执行
f1() {线程代码段}
加速线程任务回收
#pragma ccc wait
进程代码段 运算控制核心
运算核心阵列
启动加速线程
#pragma ccc async call
f2() 加速线程任务执行
种存储空间的描述, 具体见表
f2() {线程代码段}
进程代码段
加速线程任务回收
#pragma ccc wait
图 4 Parallel C 主从异构加速程序示意
为实现申威异构众核处理器上的异构加速并行编程, Parallel C 提供主核函数定义、从核函数调用等异构加
速描述功能, Parallel C 使用编译指示的形式实现从核代码描述相关功能, 方便用户增量式的进行代码移植.
Parallel C 提供的从核代码描述编译指示如表 1 所示, 包括从核函数编译指示 th_func、主核从核共用函数编译指
示 com_func, 以及从核函数阻塞调用 sync_call 和非阻塞调用 async_call 两种线程函数调用编译指示.
表 1 Parallel C 编译指示列表
编译指示 书写格式 简要功能说明
th_func #pragma ccc th_func 定义或声明线程函数
com_func #pragma ccc com_func 定义或声明进程线程共用函数
sync_call #pragma ccc sync_call 以阻塞调用方式启动线程入口函数
async_call #pragma ccc async_call 以非阻塞调用方式启动线程入口函数
wait #pragma ccc wait 等待线程入口函数返回
Parallel C 是一个两级并行的执行模型, 如图 5 所示. 第 1 级是进程并行, 进程并行是基于消息传递的分布式并行,
类似于 MPI. 第 2 级是线程并行, 每个进程可以创建多个线程, 用来加速进程任务的执行. 一个并行 C 作业包括多个进
程, 每个进程又可以创建多个线程. Parallel C 的进程和线程由运行时环境根据用户指定的进程数、线程数自动创建.
Parallel C 的存储模型与申威众核处理器的存储层次一一对应, 图 6 给出了 Parallel C 进程和线程视角的存储
层次示意. Parallel C 支持 6 2.
Parallel C 进程可以访问的存储空间包括进程私有主存空间和进程共享主存空间, 也称为节点共享空间, 只能
在一定范围实现共享, 与处理器结构相关. Parallel C 线程可以访问的存储空间包括线程私有主存空间、线程私有
局存 (LDM) 空间 (对应 SPM) 和线程共享局存 (SDM) 空间 (对应共享 SPM 空间), 以及继承自父进程的线程共享
主存空间. 进程私有主存空间可以被进程自己和其创建的线程访问, 数据默认位于进程私有主存空间; 节点共享空
间则可以被同一节点内的所有进程和线程访问, 需要使用__node_shared 关键字显式说明. 线程共享主存空间能够
被共享范围内的进程和线程访问, 只能从创建它的进程继承而来, 不能显式声明; 线程私有主存空间只能被线程自
己访问, 使用关键字__thread 显式说明; 线程私有 LDM 空间也只能被线程自己访问, 该空间的变量使用存储关键