ROCm技术小结与回顾(下)

示例3–V_MFMA_F64_4x4x4F64
考虑V_MFMA_F64_4x4x4F64指令,它计算大小为4×4的四个独立矩阵块的MFMA。执行的操作是

 ,其中

 ,

 ,

 和

 都是大小为4×4元素的矩阵,N=0,1,2,3。

下面的两张图显示了
1)输入参数A和B的四个分量的大小和形状,如图4-18所示。
2)分量映射到波阵面所拥有的寄存器中的通道。此指令的参数包括A、B、C,并返回D,因此理解每个参数和输出包含4个矩阵,如图4-19所示。
 
图4-18 输入参数A和B的四个分量的大小和形状
 
图4-19 分量映射到波阵面所拥有的寄存器中的通道
输出D和输入C的布局与输入的B布局相同。
6. 关于rocWMMA的说明
介绍了三个使用编译器内部函数利用AMD Matrix内核的示例。更多的例子可以在这里找到。内置函数将来可能会发生变化,因此最好使用AMD的rocWMMA C++库来加速混合精度MFMA操作。rocWMMA API有助于将矩阵多重累积问题分解为片段,并将其用于并行分布在波前上的分块操作。API是GPU设备代码的头库,允许矩阵核心加速可以直接编译到内核设备代码中。这可以从内核程序集生成中的编译器优化中受益。更多详细信息请参见rocWMMA仓库。
7. AMD矩阵指令计算器工具说明
对于那些对各种MFMA指令在AMD Radeon™和AMD Instinct™加速器上的执行方式感到好奇,并想了解矩阵元素和硬件寄存器之间的映射的人,建议使用AMD矩阵指令计算器工具。这个强大的工具可用于描述给定架构的WMMA指令以及MFMA ISA级指令。欢迎来自社区的问题和反馈。
8. 基于ROCm的GPU感知MPI
MPI是高性能计算中进程间通信的事实标准。MPI进程在彼此广泛通信的同时对其本地数据进行计算。这使得MPI程序能够在具有分布式内存空间的系统上执行,例如集群。MPI支持不同类型的通信,包括点对点和集体通信。点对点通信是发送过程和接收过程都参与通信的基本通信机制。发送方有一个保存消息的缓冲区和一个包含接收方将使用的信息(例如,消息标签、发送方排名号等)的信封。接收器使用信封中的信息来选择指定的消息,并将其存储在接收器缓冲区中。在集体通信中,消息可以在一组进程之间交换,而不仅仅是两个进程。集体通信为进程提供了以方便、便携和优化的方式执行一对多和多对多通信的机会。集体沟通的一些例子包括广播、allgather、alltoall和allreduce。
9. GPU感知MPI
许多MPI应用程序支持在GPU集群上执行。在这些应用程序中,代码的计算密集型部分在GPU(也称为设备)上卸载和加速。当涉及到MPI通信时,MPI进程需要通信驻留在GPU缓冲区中的数据。GPU感知MPI提供了将GPU缓冲区传递给MPI调用的机会。这消除了程序员通过主机内存暂存GPU缓冲区的负担,使他们能够开发出更可读、更简洁的应用程序。此外,它可以通过利用ROCm RDMA(远程直接内存访问)等加速技术使应用程序更有效地运行。ROCm RDMA使Mellanox Infiniband HCA(主机通道适配器)等第三方设备能够在没有主机干预的情况下,与GPU内存建立直接的对等数据路径。大多数知名的MPI实现,包括OpenMPI、MVAPICH2和Cray MPICH,都支持GPU感知通信。
以下代码显示了一个简单的GPU感知点对点通信示例:
#include <stdio.h>
#include <hip/hip_runtime.h>
#include <mpi.h>
 
int main(int argc, char **argv) {
  int i,rank,size,bufsize;
  int *h_buf;
  int *d_buf;
  MPI_Status status;
  bufsize=100;
  MPI_Init(&argc,&argv);
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  MPI_Comm_size(MPI_COMM_WORLD, &size);
  //分配缓存
  h_buf=(int*) malloc(sizeof(int)*bufsize);
  hipMalloc(&d_buf, bufsize*sizeof(int));
  //初始化缓存
  if(rank==0) {
    for(i=0;i<bufsize;i++)
      h_buf[i]=i;
  }
  if(rank==1) {
    for(i=0;i<bufsize;i++)
      h_buf[i]=-1;
  }
  hipMemcpy(d_buf, h_buf, bufsize*sizeof(int), hipMemcpyHostToDevice);
  //通信
  if(rank==0)
    MPI_Send(d_buf, bufsize, MPI_INT, 1, 123, MPI_COMM_WORLD);
  if(rank==1)
    MPI_Recv(d_buf, bufsize, MPI_INT, 0, 123, MPI_COMM_WORLD, &status);
  //验证结果
  if(rank==1) {
    hipMemcpy(h_buf, d_buf, bufsize*sizeof(int), hipMemcpyDeviceToHost);
    for(i=0;i<bufsize;i++) {
      if(h_buf[i] != i)
        printf("错误:缓冲区[%d]=%d,但应为%d\n", i, h_buf[i], i);
      }
    fflush(stdout);
  }
  //释放缓存
  free(h_buf);
  hipFree(d_buf);
  MPI_Finalize();
}
从代码中可以看出,将GPU缓冲区(d_buf)传递给MPI_Send和MPI_Recv调用。此缓冲区是使用hipMalloc在GPU上分配的。
要编译和运行此代码,需要ROCm以及系统上可用的GPU感知MPI实现。可以在AMD ROCm™安装中找到ROCm安装说明。档稍后将讨论使用不同MPI实现构建和运行上述代码(gpu-aware.cpp)的说明。
10. 与OpenMPI进行GPU感知通信
大多数知名的MPI实现都支持GPU感知通信。将提供构建支持ROCm的GPU感知OpenMPI的说明。
要构建支持ROCm的GPU感知OpenMPI,首先需要安装统一通信X(UCX)。UCX是一个用于高带宽和低延迟网络的通信框架。使用以下命令构建UCX(版本1.14):
git clone https://github.com/openucx/ucx.git
cd ucx
git checkout v1.14.x
./autogen.sh
./configure --prefix=$HOME/.local --with-rocm=/opt/rocm --without-knem --without-cuda --enable-gtest --enable-examples
make -j
make install
成功安装后,UCX将在$HOME/.local目录中可用。现在,可以使用以下命令安装支持ROCm的GPU Aware OpenMPI:
git clone --recursive -b v5.0.x git@github.com:open-mpi/ompi.git
cd ompi/
./autogen.pl
./configure --prefix=$HOME/.local --with-ucx=$HOME/.local
make -j
make install
在OpenMPI 5.0之后,还可以在configure命令中添加--With-rocm=/opt/rocm,以利用Open MPI中的一些rocm功能,例如派生数据类型、MPI I/O等。成功安装后,带有rocm支持的OpenMPI将在$HOME/.local中提供。现在,可以按如下方式设置PATH和LD_LIBRARY_PATH:
export PATH=$HOME/.local/bin:$PATH
export LD_LIBRARY_PATH=$HOME/.local/lib:$LD_LIBRARY_PATH
要使用OpenMPI编译GPU感知的MPI程序,如GPU-ware.cpp,请设置OMPI_CC环境变量,将mpicc封装编译器更改为使用hipcc。然后,可以分别使用mpicc和mpirun编译和运行代码:
export OMPI_CC=hipcc
mpicc -o./gpu-aware./gpu-aware.cpp
mpirun -n 2./gpu-aware
11. 与Cray MPICH进行GPU感知通信
将讨论如何使用Cray MPICH构建和运行GPU感知MPI程序。首先,确保系统上加载了ROCm、Cray MPICH和craype-accel-amd-gfx90a/craype-accel-amd-gfx908模块。编译代码有两种选择:
使用Cray编译器封装器编译代码并链接ROCm:
cc -o./gpu-aware./gpu-aware.cpp -I/opt/rocm/include/ -L/opt/rocm/lib -lamdhip64 -lhsa-runtime64
用hipcc编译代码并链接Cray MPICH:
hipcc-o./gpu-aware./gpu-aware.cpp -I/opt/cray/pe/mpich/8.1.18/ofi/cray/10.0/include/ -L/opt/cray/pe/mpich/8.1.18/ofi/cray/10.0/lib -lmpi
编译成功后,可以使用以下命令运行代码:
export MPICH_GPU_SUPPORT_ENABLED=1
srun -n 2./gpu-aware
注意,MPICH_GPU_SUPPORT_ENABLED设置为1以启用GPU感知通信。
12. OSU微基准测试的性能测量
OSU微基准测试(OMB)提供了一系列MPI基准测试,用于衡量各种MPI操作的性能,包括点对点、集体、基于主机和基于设备的通信。将讨论如何使用OSU微基准测试来测量设备到设备的通信带宽。使用前面讨论的OpenMPI安装进行的实验。
可以使用以下命令构建支持ROCm的OSU微基准测试:
wget */download/mvapich/osu-micro-benchmarks-7.0.1.tar.gz[1] [2] 
tar -xvf osu-micro-benchmarks-7.0.1.tar.gz
cd osu-micro-benchmarks-7.0.1
./configure --prefix=$HOME/.local/ CC=$HOME/.local/bin/mpicc CXX=$HOME/.local/bin/mpicxx --enable-rocm --with-rocm=/opt/rocm
make -j
make install
成功安装后,OMB将在$HOME/.local/上提供。可以使用以下命令运行带宽测试:
mpirun -n 2 $HOME/.local/libexec/osu-micro-benchmarks/mpi/pt2pt/osu_bw 
在带宽测试中,发送方进程向接收方发送固定数量的背靠背消息。在接收到所有这些消息后,接收方进程会发送一个回复。此过程重复几次迭代。带宽是根据经过的时间和传输的字节数计算的。上述命令末尾的D D指定希望在设备上分配发送和接收缓冲区。
如果使用上述命令没有获得预期的带宽,则OpenMPI默认情况下可能没有使用UCX。要强制OpenMPI使用UCX,可以将以下参数添加到mpirun命令中:
mpirun --mca pml ucx --mca pml_ucx_tls ib,sm,tcp,self,cuda,rocm -np 2 $HOME/.local/libexec/osu-micro-benchmarks/mpi/pt2pt/osu_bw D D
还可以使用以下命令运行集体通信测试:
mpirun -n 4 $HOME/.local/libexec/osu-micro-benchmarks/mpi/collective/osu_allreduce -d rocm
上面的命令使用四个进程运行MPI_Allreduce延迟测试。在这个测试中,基准测试测量了MPI_Allreduce集合操作在四个进程中的平均延迟,针对不同的消息长度,经过大量迭代-d rocm指定进程应在GPU设备上分配通信缓冲区。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/900732.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ROCm技术小结与回顾(上)

ROCm技术小结与回顾 在这一部分中,首先检查了Kernel 5在各种AMD GPU和问题大小上的性能,并注意到当网格超过一定大小阈值时,性能似乎会急剧下降。通过实验确定,LLC的大小是大型xy平面问题性能的限制因素。提出了两种不同的解决方法来规避缓存大小的问题,这两种方法都只需要…

有限差分法——拉普拉斯第4部分

有限差分法——拉普拉斯第4部分 提出了拉普拉斯算子有限差分法的HIP实现,并应用了四种不同的优化。在这些代码修改过程中,观察到由于全局内存的总取数减少,性能得到了逐步提高。然后,应用了进一步的优化,以在512512512上达到预期的性能目标MI250X GPU的单个GCD上的512个点…

推荐几本书1《AI芯片开发核心技术详解》、2《智能汽车传感器:原理设计应用》、3《TVM编译器原理与实践》、4《LLVM编译器原理与实践》,谢谢

4本书推荐《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》由清华大学出版社资深编辑赵佳霓老师策划编辑的新书《AI芯片开发核心技术详解》已经出版,京东、淘宝天猫、当当等网上,相应陆陆续续可以购买。该…

WebKit Inside: CSS 的匹配原理

WebKit Inside: CSS 的匹配原理相关文章WebKit Inside: CSS 样式表的解析 WebKit Inside: CSS 样式表的匹配时机 WebKit Inside: Acitvie 样式表 当WebView解析完所有外部与内联样式表,就要进入到CSS样式表的匹配阶段。 1 相关类图 WebKit中参与CSS样式表匹配的主要类如下图所…

助记词-公私钥-子私钥派生-钱包地址原理及实现

0x01.简介 现在各种DEX、钱包插件中的钱包导入及创建,大部分是通过助记词来备份的; 助记词是明文私钥的一种表现形式,最早由BIP39提出,为了帮助用户记住复杂的私钥; 一组助记词可以生成各个链上的公私钥,进而可以算出钱包地址;掌握了助记词,就代表掌握了该组助记词上的…

AI 代理的未来是事件驱动的

AI 代理即将彻底改变企业运营,它们具备自主解决问题的能力、适应性工作流以及可扩展性。但真正的挑战并不是构建更好的模型。 代理需要访问数据、工具,并且能够在不同系统之间共享信息,其输出还需要能被多个服务(包括其他代理)使用。这不是一个 AI 问题,而是一个基础设施…

树莓派 3B + Bookworm:mjpg-streamer 正确安装全流程(原创)

在树莓派 OS Bookworm 版本上安装 mjpg-streamer 并非像旧版本一样简单,许多网上的教程已经过时,甚至存在错误。我在尝试过程中遇到了多个问题,例如依赖库缺失、编译失败等,但最终成功解决并搭建了 远程视频流监控系统。本教程基于 树莓派 3B,整理了一套 完整、可复现 的 …

1.匀速圆周运动

1.平面中的匀速圆周运动 例子:一个物体在半径为r的圆形路径中以恒定大小的速度s移动。 建立一个二维坐标系,物体位于平面上,圆心在原点上。物体的瞬时速度v(t)总是与其运动轨迹相切,所以物体任意时刻的速度与轨迹圆相切,并且速度的大小:$|v(t)|=s$ 下图右侧的两个三角形,…

Fiddler如何抓取HTTPS请求

如果发现fiddler只能抓取http请求,但是抓取不到HTTPS请求,看查看是不是没有勾选解密https流量入口:Tools——>Options——>HTTPS,勾选以下选框设置完成过后可以正常抓取HTTPS的请求了

愿景2025|未来已来 各地未来产业加速布局

各地2025年政府工作报告显示,从东部沿海到中西部内陆,从人工智能到低空经济,从量子科技到生物制造,新兴产业和未来产业的布局正在加速展开,这些产业不仅成为各地抢占发展新赛道的重要抓手,更是推动经济高质量发展的新增长极。

Fiddler工具无法抓取请求的几种原因

1、设置了过滤: fiddler中支持我们设置过滤条件,这样fiddler就不会抓取所有的请求,比如我们要抓取一个指定ip地址的请求,就可以设置对应的过滤信息,但是结束过后可能忘记删除了,导致下一次使用fiddler的时候抓不到请求。 1、首先进入Fiddler界面 2、点击Filters,如果设置…