在处理器及其系统的开发中,通常的做法是在开发处理器芯片的同时使用模拟器环境进行编译器和操作系统的开发。 这也是由 IBM 在内部完成的,根据模拟级别使用不同类型的模拟器环境进行开发。 许多常用的 IBM Power 处理器及其系统开发工具都向公众开放,以促进生态系统。
功能模拟器( Functional Simulator ) 是一个被多个 IBM 内部团队(编译器开发团队、固件、 Linux OS 开发团队、数据库开发团队、性能团队、研究团队、芯片验证团队等)使用了 20 多年的工具 . Power10 功能模拟器是专门面向 Power10 的版本,是一个完整的指令集模拟器,可以模拟 Power10 处理器上的所有指令集。作为软件,可以在 Linux 上运行 Power10 固件、裸机软件、 Linux 和应用程序。
需要注意的是虽然 Power10 功能模拟器可以模拟 Power10 处理器的完整指令集,但由于实际应用的复杂性,该模拟器可能无法模拟 Power10 硬件 / 系统的所有方面,例如网络或存储 I/O 子系统等,所以在某些情况下可能无法准确反映 Power10 硬件的行为。
Power10 功能模拟器包括以下特性:
² 所有单元的功能行为:加载 / 存储、定点单元 (FXU) 、浮点单元 (FPU) 、十进制浮点 (DFP) 、矢量多媒体扩展 (VMX) 、矢量标量扩展 (VSX) 等等
² 异常和中断处理
² 地址转换,准虚拟化硬件页表 (HPT) 和两级基数树
² 内存和基本转换缓存建模:段后备缓存 (SLB) 、页表缓存 (TLB) 、有效到实地址转换 (ERAT)
² 指令前缀支持
² 适用于 AI 的 VSX 矩阵乘法 (MMA) 指令
² 用于加速矩阵乘法的降低精度指令
² 复制粘贴功能
² 适用于 Linux/ 混合云的新备用中断位置 (AIL) 和管理程序备用中断位置 (HAIL) 可编程功能
² 自定义用户初始化脚本
² 用于调试的处理器状态控制:步进、运行、循环运行、停止等
² 寄存器和内存读 / 写交互
如图 1 所示, Power10 功能模拟器与堆栈一起工作
**注意:只有 x86_64 模拟器是公开可用的, ppc64le 模拟器是供内部使用的。
要设置 Power10 功能模拟器,在 Linux 上下载后安装 rpm 或 deb 包,然后按照用户指南和 README 文件 (/opt/ibm) 中的步骤安装各种映像(固件、 Linux 内核和 Linux 磁盘) /systemsim-p10/examples/linux/README )。安装镜像后,您可以在 X Window System 环境中启动模拟器。 ( X Window System 是必需的,因为模拟器中使用了 xterm 和 tcl 接口)。模拟器中有一个名为 callthru 的辅助应用程序,用于在主机和模拟器之间交换文件。
图 2 显示了模拟器执行窗口的屏幕截图。左边的前窗是模拟器的控制台,右边的后窗是模拟器的命令窗口。
由于是 Power10 处理器的模拟器环境,所以可以检查新的 Power10 指令。 Power10 已经发布了对 LLVM 或 GCC 编译器和 Linux 内核的支持,并且得到了较新版本的编译器和内核的支持。 功能模拟器的 Linux 映像还包括 Power10 的内核和编译器。 提供了一个名为 Advanced Toolchain 的编译器,它允许您尝试 Power 处理器的新功能,其调整比 GCC 的主流编译器更好。 本节介绍了一些您可以尝试使用这些编译器的新指令。
Power10 支持带前缀的新指令格式。 Power 中的指令集架构是精简指令集计算机 (RISC) 架构,它基于 32 位固定指令长度。 但是新的指令格式是在这条 32 位指令之前添加了一个 32 位前缀。 这个新指令使得扩展指令成为可能。 此扩展是 Power 架构的革命性和历史性的变化,因为在这之前 Power 使用固定指令长度已超过 30 年。
作为一个易于理解的示例, 64 位指令长度可以处理较大的立即数,这意味着可以用一条指令处理较大的值。 此外,由于操作码和寄存器编号字段也可扩展,例如向量运算中的 PERMUTE 指令,可以用一条指令描述更复杂的处理。
让我们通过示例代码检查它在 Power10 功能模拟器上的工作原理 ( [GCC test code](https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/testsuite/gcc.target/powerpc/prefix-add.c;h=0027406e4579dc095dc1e1cac3358aefe20bdcd7;hb=HEAD) )
在 Power10 功能模拟器上编译这段代码,可以看到 Power10 编译的代码是一条指令,而 Power9 编译的代码是两条指令,如下所示:
root@ubuntu1804mambo:~# cat paddi.c
unsigned long add (unsigned long a) { return a + 0x12345U; }
root@ubuntu1804mambo:~# /opt/at14.0/bin/gcc -O2 -mcpu=power10 -c paddi.c
root@ubuntu1804mambo:~# /opt/at14.0/bin/objdump -S paddi.o
paddi.o: file format elf64-powerpcle
Disassembly of section .text:
0000000000000000 :
0: 01 00 00 06 paddi r3,r3,74565
4: 45 23 63 38
8: 20 00 80 4e blr
...
root@ubuntu1804mambo:~# /opt/at14.0/bin/gcc -O2 -mcpu=power9 -c paddi.c
root@ubuntu1804mambo:~# /opt/at14.0/bin/objdump -S paddi.o
paddi.o: file format elf64-powerpcle
Disassembly of section .text:
0000000000000000 :
0: 01 00 63 3c addis r3,r3,1
4: 45 23 63 38 addi r3,r3,9029
8: 20 00 80 4e blr
...
Show more
这样, Power10 就可以用更少的指令编写程序。 此外,除了这个前缀指令之外, Power10 还具有一种称为指令融合的增强功能,它允许在解码器中将两条指令作为一个微操作一起执行,因此,即使是那些没有经过 Power10 编译的程序也可以高效运行。
除了可以在 Power8 和 Power9 处理器上使用的向量运算指令 VMX/VSX 指令外, Power10 还提供称为矩阵乘法辅助 (MMA) 指令的矩阵运算指令。
Power10 上的每个 CPU 内核都安装了四个专用硬件单元,可以高速处理矩阵外积运算 A ← {±}A {±} XYT 。 除了下图所示的双精度和单精度外,还支持 Bfloat 半精度和 Int4 运算。 这些使得无需 GPU 等扩展卡就可以更高效、更快速地运行 AI 推理工作负载。
为了充分利用每个内核的四个 MMA 专用单元, Power10 中还重新设计了内存和 L3/L2/L1 缓存的读 / 写带宽,每个都比 Power9 的带宽增加了一倍。
这些 MMA 指令可以用 Power10 功能模拟器完全模拟,因此可以用汇编器或编译器的内置指令(内部)来测试它们。 MMA 指令实现与传统的 VMX/VSX 指令具有高度的相似性,并且具有使用与 VMX/VSX 指令相同的寄存器来发布指令的机制。
举例:编译器内置指令描述的单精度 4×4 矩阵乘积示例如下。
typedef vector unsigned char vec_t;
typedef __vector_quad acc_t;
void sgemm_kernel_4x4(float a, float b, float* c, int K, int lda, int ldb, int ldc)
{
int i;
vec_t vec_A, vec_B, vec_C[4];
acc_t acc_0;
__builtin_mma_xxsetaccz(&acc_0);
for (i = 0; i < K; i++) {
vec_A = ((vec_t )(a + (i * lda)));
vec_B = ((vec_t )(b + (i * ldb)));
__builtin_mma_xvf32gerpp(&acc_0, vec_A, vec_B);
}
__builtin_mma_disassemble_acc(vec_C, &acc_0);
((vec_t )(c)) = vec_C[0];
((vec_t )(c + ldc)) = vec_C[1];
((vec_t )(c + (2 * ldc))) = vec_C[2];
((vec_t )(c + (3 * ldc))) = vec_C[3];
}
Show more
关于使用 MMA 指令创建和执行程序,可参考 IBM 已发布的红皮书《 [Matrix-Multiply Assist Best Practices Guide](http://www.redbooks.ibm.com/abstracts/redp5612.html?Open) 》,其中详细介绍了有关 MMA 指令代码的详细信息,所有代码都可以在模拟器上运行。
大家可以尝试已经描述的 MMA 指令,在实际用于 AI 应用程序的情况下,可以通过使用几个优化的库轻松利用 MMA 。 与 Linux 内核和编译器一样, Power10 MMA 对几个优化库的支持已经实现并发布。
除了优化的库之外, TensorFlow 和 PyTorch 等深度学习框架还可以通过 MMA 指令在内部使用 Eigen for TensorFlow 和 OpenBLAS for PyTorch 进行加速。针对开放神经网络交换 (ONNX) 等其他运行时的 MMA 优化也在进行中。
在本文中,我们简要介绍了 Power10 功能模拟器的概述、用法和示例,让您可以快速试用 Power10 指令。目前浪潮商用机器有限公司正在积极研发基于 Power10 处理器的国产最新一代 K1 Power 服务器,预计不久之后就会发布。新一代 K1 Power 服务器将提供更加优秀的性能、更加卓越的可靠性及更加强大的扩展性,将进一步助力国内客户信息化的蓬勃发展!
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞1
添加新评论0 条评论