Page 79 - 《软件学报》2024年第6期
P. 79
方燕飞 等: 申威众核处理器访存与通信融合编译优化 2655
或者一定范围内的离散访问数据批量传输进 SDM 空间, 将原有主存高延迟访问转换为 SDM 空间的较低延迟访问.
上述 3 种优化方式的数据移动路径如图 7 所示, 根据各级存储空间的访问延迟可以看出, 优化后的数据访问
延迟将从数百拍提升至数十拍甚至数拍, 在单次传输的数据量远大于细粒度访问的数据宽度情况下, 批量传输的
数据访问效率远高于单个细粒度的数据访问, 所以整体效率可以获得明显提升.
#include <parallel.h>
#define N 1L<<30
#define M 1<<20
//data和source为主存数组 // 连续读访问主存数组data
int data[N][M]; for(k=0;k<N;k++)
int source[N][N]; for(l=0;l<M;l++)
__thread_sdm int sum[64];//sum为SDM数组 {
#pragma ccc th_func mysum=data[k][l]+...;
void kernel() }
{ sum[myid] = mysum;
… m_sync(CCC_ARRAY);//核组同步
// 每个线程不同任务块 if(myid==0)
for(i=mybs;i<mybe;i++) {
{ // 连续读访问SDM数组sum
ldm_addr/sdm_addr (缓冲区地址) ldm_size/sdm_size (整数表达式)
for(j=0;j<N;j++) for(n=1;n<64;n++)
{ sum[0]+=sum[n];
// 局部离散写访问主存数组data }
// 连续读访问数组Source …
pose = func(source[i][j]); }
data[i][pose] = ...;
}// 循环j
m_sync(CCC_ARRAY);//核组同步
}// 循环i
图 8 可优化的访存场景示意图
3.2 多级存储层次访存融合优化编译指示设计
在编译器访存融合优化方法进行实现的过程中, 为保证程序的正确性, 必须开展精确的数据相关性分析, 而依
赖编译器的自动分析有一定的局限性, 对于核心循环有函数调用、指针别名等情况下, 编译时难以获取准确的数
据相关性信息, 从而导致编译器放弃一些潜在的优化机会, 比如在图 8 中, 函数 fun 中是否有对全局数组 source 的
其他别名访问, 编译器如果分析不清楚, 就会放弃对 source 的访存优化. 编译指示是一种将程序设计人员掌握的程
序信息或者优化意图传递给编译器的通用方式, 结合了人的经验和编译器的自动分析变换能力, 是应对复杂编程
优化问题的一种常用方式. 为了使面向多级存储层次的访存融合优化方法能够对应用程序具有更好的适应性, 挖
掘更多优化机会, 本文设计了相应的优化编译指示, 采用半自动的方式对程序性能进行优化实现.
从存储空间类型的角度, 本文设计了 3 种缓冲优化模式, 分别对应第 3.1 节中的 3 种优化, 即 mem2ldm、
sdm2ldm 和 mem2sdm. 另外, 从缓冲区数量的角度, 又可以将上述每种优化区分为单缓冲优化和双缓冲优化.
Parallel C 设计的缓冲优化编译指示具体说明如下.
编译指示格式如下:
#pragma ccc sbuf/dbuf mem2ldm/sdm2ldm/mem2sdm (变量列表) \
该编译指示用在循环结构之前. 指导语句及各子句的含义见表 3.
为引导用户写出正确的编译指示, 以确保编译器可以开展高效正确的优化, 需做以下定义.
1) 优化维的定义: 编译器在数组访问方式分析时, 对每个数组从最高维到低维依次分析各维的访问下标, 将分
析时遇到的第 1 个下标是非循环不变量的维定义为优化维.
2) 离散访问数组的定义: 优化维的下标不是循环变量的放射下标.
3) 连续访问数组的定义: 优化维的下标是循环变量的放射下标, 形如: i+c, 其中 i 为被指示循环的索引变量, c
为常量.